【问题标题】:Django - what's the difference between a model field and a model attribute?Django - 模型字段和模型属性有什么区别?
【发布时间】:2016-01-27 13:11:42
【问题描述】:

在此链接中(对于 ReadOnlyField):http://www.django-rest-framework.org/api-guide/fields/#readonlyfield 它说“当包含与属性而不是模型字段相关的字段名称时,该字段默认与 ModelSerializer 一起使用”。话虽如此,您能给我举一个“属性”的模型字段名称和“字段”的模型字段名称的示例吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    Django 中,model field 与数据库中的列有关。另一方面,model attribute 属于添加到 model 的方法或属性。

    示例

    class MyModel(models.Model):
        name = models.CharField()
        quantity = models.IntegerField()
        price = models.DecimalField()
    
        @property
        def description(self):
            return '{}x of {}'.format(quantity, name)
    
        def compute_total(self):
            return quantity * price
    

    在上面的示例中,namequantitypricemodel fields,因为它们是数据库中的列。同时descriptioncompute_totalmodel attributes

    【讨论】:

    • 您提到“模型属性与添加到模型的方法或属性有关”。有没有办法在没有 @property 装饰器的情况下创建模型属性?在您的示例中,您将@property 装饰器用于description,但没有用于compute_total,但您提到compute_total 也是模型属性。话虽如此,是否需要@property 装饰器?它有什么用途?
    • 不需要@property 装饰器。当您添加装饰器时,它成为一个对象属性,这意味着您在调用它时不能传递参数。因此,对于上述内容,您可以调用description,例如obj.description。同时,compute_total 是一个方法,这意味着您可以在调用它时添加/传递参数。你打电话给compute_total,比如obj.compute_total(),或者如果有参数,obj.compute_total(arg1, arg2, kwarg1=val1)
    • 您想什么时候使用model_attributes?您将如何在查询集上使用模型属性与通过annotate 做某事之间做出决定? (在这里学习 Python/Django 2 周,所以我有很多问题)
    • 记住属性(那些使用 @property 装饰器的)不能使用 django 的查询集 API 过滤,而 fields 可以,因为字段映射到数据库列。 stackoverflow.com/questions/1205375/filter-by-property
    【解决方案2】:

    字段完全处理 django 的 ORM,属性是常规的类变量,用于保存类的特定实例的状态。

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2011-07-25
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      相关资源
      最近更新 更多