*_在 Django 模型上设置属性

2024-05-05

我有一个非常基本的问题django.db.models.

In this 官方 Django 教程 https://docs.djangoproject.com/en/1.4/intro/tutorial01/,如果您搜索单词“choice_set“,你会看到那个变量”choice_set" 没有在任何地方声明,尽管神奇的是,我们可以开始在代码中使用它。

我想知道,什么是django.db.models.Model这是否神奇地创建了 *_set 变量,它还创建了哪些其他变量?


您可以使用以下命令获取类的属性的完整列表,包括您定义的属性和为其定义的属性dir功能,只需做

 dir(Poll)

你最终会得到看起来有点像的东西(尽管不完全一样——我正在以一种迂回的方式构建它):

['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__',
'__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__',
'__init__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__',
 '__weakref__', '_base_manager', '_default_manager', '_deferred', '_get_FIELD_display', 
'_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', 
'_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', '_set_pk_val', 
'clean', 'clean_fields', 'curve_set', 'date_error_message', 'delete', 'full_clean', 'objects', 
'pk', 'prepare_database_save', 'save', 'save_base', 'choice_set',
'serializable_value', 'unique_error_message', 'validate_unique']

这是很多价值!我们可以看到类似的异常DoesNotExist and MultipleObjectsReturned,以及最重要的一个,objects。但其中一些属性并不是 Django 添加的。如果你这样做dir(object())你会发现属性列表all对象:

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

大多数情况下,您可以忽略以 2 开头和结尾的内容__。其他大部分是由 Django 添加的。


至于它实际设置的方式和位置:Django 使用以下方法动态设置每个新模型的大部分属性:models.Model元类。首先要知道的是,您可以使用以下方法动态向类添加成员或方法setattr功能:

class X:
    pass
setattr(X, "q", 12)
print X.q  # prints 12

这就是它如何根据属性名称创建新属性。

在本教程中,允许开始定义这些额外属性的重要行是:

class Poll(models.Model):

这意味着Poll类继承了models.Model类(属于 Django)。继承有许多有用的属性——基本上,Poll类继承了一些行为models.Model类已设置 - 但它定义大部分新属性的位置是在模型中元类 https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python。元类是一个棘手的概念,但基本上它们是创建新类的方法,通过定义元类,Django 可以在需要时介入。models.py正在定义元类,并定义任何新的 .

可以找到模型元类的代码here https://github.com/django/django/blob/master/django/db/models/base.py(从第 55 行开始)——这是一组代码,实际上是从头开始逐步创建一个类。尽管它看起来很复杂,但只需查看变量名称就可以从中了解很多内容。例如,看看有希望命名的add_to_class method:

def add_to_class(cls, name, value):
    if hasattr(value, 'contribute_to_class'):
        value.contribute_to_class(cls, name)
    else:
        setattr(cls, name, value)

除了以下一种特殊情况之外'contribute_to_class(对您的兴趣并不重要),这是一种向类添加新属性(例如方法或成员)的方法。它被调用的地方给了我们它所添加的内容的提示:

 class.add_to_class('DoesNotExist', subclass_exception(str('DoesNotExist') ...<truncated>...

这里添加的是DoesNotExist异常,如果您请求一个,则返回该异常Poll那不存在。 (通过运行来亲自查看Poll.objects.get(pk=1337),或直接输入Poll.DoesNotExist).

但 Django 实际上比这更复杂。这specific _set您所询问的属性并不是为每个模型构建的 - 它是在一个字段通过一个字段与另一个字段相关时创建的ForeignKey(就像你的Poll and Choice)。各个地方赋值的地方很复杂,但基本上都回到了这个get_accessor_name函数于相关.py https://github.com/django/django/blob/master/django/db/models/fields/related.py

def get_accessor_name(self):
    # This method encapsulates the logic that decides what name to give an
    # accessor descriptor that retrieves related many-to-one or
    # many-to-many objects. It uses the lower-cased object_name + "_set",
    # but this can be overridden with the "related_name" option.
    if self.field.rel.multiple:
        # If this is a symmetrical m2m relation on self, there is no reverse accessor.
        if getattr(self.field.rel, 'symmetrical', False) and self.model == self.parent_model:
            return None
        return self.field.rel.related_name or (self.opts.object_name.lower() + '_set')
    else:
        return self.field.rel.related_name or (self.opts.object_name.lower())

这只是想出名称——追溯它以弄清楚它是如何添加到类中的,这可不是一件小事。但我希望你从中看到 Django 有很多机会添加这样的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

*_在 Django 模型上设置属性 的相关文章

  • 错误请求 400:nginx/gunicorn

    我已经遵循了这个教程 http blog wercker com 2013 11 25 django 16 part3 html http blog wercker com 2013 11 25 django 16 part3 html我现
  • 创建django权限,报错:ContentType匹配查询不存在

    我正在尝试添加两个组并授予他们对我的 Django 项目的权限 但我不断收到错误 ContentType 匹配查询不存在 我在跑步 姜戈 1 5 4 Python 2 7 3 南0 8 2 后SQL 9 3 这是我的代码 import dj
  • HTMX 用于处理来自 django 后端的消息

    我想使用 HTMX 来显示来自 django 后端的消息 经过大量的试验和错误 我最终得到了一个可行的解决方案 我想把它留给任何寻找它的人 另外 请随时发表您的建议 不幸的是 除了一点点example https github com ad
  • 使 Django 内置 send_mail 函数默认使用 html

    我想替换内置发送邮件功能 仅适用于纯文本电子邮件 用我自己的智能发送邮件函数 自动生成 html 和纯文本版本 一切都按我自己的电子邮件的预期进行 在我自己的应用程序中定义 我可以在views py中以这种方式做到这一点 from djan
  • 检索 geodjango 多边形对象的边界框

    如何在 geodjango 中获取 MultiPolygon 对象的边界框 在 API 中找不到任何内容http geodjango org docs geos html http geodjango org docs geos html
  • 基于值而不是类型的单次调度

    我在 Django 上构建 SPA 并且有一个庞大的功能 其中包含许多功能if用于检查我的对象字段的状态名称的语句 像这样 if self state new do some logic if self state archive do s
  • 无法创建超级用户 Django

    我假设这是因为我的超级用户依赖于还没有现有数据的 UserProfile 我的模型看起来像 from django db import models from django contrib auth models import User f
  • Heroku 与 django 通道的正确 procfile/要求是什么?

    tl dr django 频道应用程序在本地使用 manage py runserver 运行 但不在 heroku 上运行 我是 django 通道的新手 尝试使用 heroku 通道部署一个非常基本的 django 应用程序 我最初使用
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我
  • django AuditTrail 与还原

    我正在开发一个新的网络应用程序 我需要将数据库中的任何更改存储到审核表中 此类审计表的目的是 稍后在真正的物理审计中 我们可以确定在某种情况下发生了什么 谁编辑了什么以及数据库当时的状态是什么 复杂的计算 所以大多数审计表将被写入而不是读取
  • 将 transaction.commit_manually() 升级到 Django > 1.6

    我继承了为 Django 1 4 编写的应用程序的一些代码 我们需要更新代码库以使用 Django 1 7 并最终更新到 1 8 作为下一个长期支持版本 在一些地方它使用旧风格 transaction commit manually and
  • Django通用外键和select_相关

    我试图使用与通用外键的关系来选择模型 但它没有按预期工作 我认为用代码可以更好地说明和理解 class ModelA models Model created models DateTimeField auto now add True c
  • 在 Bootstrap 中使单击的选项卡处于活动状态

    我正在使用 Django 并将 Bootstrap 与 Django 集成 这是我的导航栏 HTML 代码 div class navbar navbar default navbar fixed top div class contain
  • 如何在 Django QuerySet 中将 DateField() + TimeField() 转换为本地时间?

    我的模型为这些字段 date models DateField 开始时间 models TimeField 结束时间 models TimeField 我想用以下方式注释查询集start datetime and end datetime
  • Django:测试客户端的上下文在 shell 中为空

    我无法访问context的属性HttpResponse来自 ipython 的对象 但单元测试访问context 这是单元测试 测试运行正常通过 from django test import Client TestCase from dj
  • Django“和”Pinax 还是只是 Pinax?

    我正在开发一个个人项目 该项目已 完成 但现在我想添加一个社交应用程序 我认为 Pinax 已经为这项任务做好了准备 我想知道一些事情 我可以在我的项目中像 django 应用程序一样使用 pinax 吗 或者我需要使用 pinax 重新设
  • Heroku 上的 Django 翻译无法完全正常工作

    我在 Heroku 上部署了 Django 应用程序 并添加了https github com piotras heroku buildpack gettext git此 ugettext 构建包和应用程序的某些部分已注释翻译 本地可以用
  • 如何处理 Django 中的错误

    我想让我的 django 应用程序尽可能对用户友好 并且我想处理适当的错误并让它推出类似于 javascript 中的警报的错误消息 我想在没有上传文件时执行此操作 因此 当按下上传按钮并且尚未上传任何内容时 将会发出一条警报消息 我的看法
  • Django 模型:默认日期时间未转换为 SQL CURRENT_TIMESTAMP

    我正在使用 Django 模型创建 PostgreSQL DB 我有一个 DateTimeField 我想将当前时间戳设置为默认值 我知道有多个消息来源建议如何做到这一点 但是 当我在 Django 之外检查数据库时 默认时间戳不会显示 我
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解

随机推荐