【问题标题】:Django models and Python propertiesDjango 模型和 Python 属性
【发布时间】:2012-06-16 08:48:32
【问题描述】:

我尝试使用 python 属性设置 Django 模型,如下所示:

class Post(models.Model):
    _summary = models.TextField(blank=True)
    body = models.TextField()

    @property
    def summary(self):
        if self._summary:
            return self._summary
        else:
            return self.body

    @summary.setter
    def summary(self, value):
        self._summary = value

    @summary.deleter
    def summary(self):
        self._summary = ''

到目前为止一切顺利,在控制台中我可以很好地与摘要属性交互。但是当我尝试用这个来做任何 Django-y 的事情时,比如Post(title="foo", summary="bar"),它会很适合。有什么方法可以让 Django 很好地使用 Python 属性?

【问题讨论】:

  • 这是 Python 中的标准方法 (docs.python.org/library/functions.html#property) -- 我只是使用装饰器样式而不是显式调用 property
  • 你的意思是Post(body="foo", summary="bar")?(注意body而不是title)。这应该有效。
  • @okm 我修正了那个错字。它曾经说Post(title="foo", summary="bar"),这是一个明显的错字。

标签: python django django-models


【解决方案1】:

不幸的是,Django 模型不能很好地处理 Python 属性。它的工作方式是,ORM 只识别 QuerySet 过滤器中字段实例的名称。

您将无法在过滤器中引用summary,而必须使用_summary。这很快就会变得混乱,例如要在多表查询中引用此字段,您必须使用类似

User.objects.filter(post___summary__contains="some string")

有关属性支持的更多详细信息,请参阅https://code.djangoproject.com/ticket/3148

【讨论】:

  • 你试过了吗? The code 表明从 5 年前就可以通过 kwargs 分配财产......
  • 哦,看来你是对的——构造函数确实支持属性;这是为了支持GenericForeignKey。然而,关于 QuerySets 的另一个论点成立。
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2014-06-03
  • 2017-02-10
  • 1970-01-01
  • 2016-03-17
  • 2017-08-05
相关资源
最近更新 更多