【问题标题】:Add a virtual field to a django query将虚拟字段添加到 django 查询
【发布时间】:2019-12-12 19:01:30
【问题描述】:

我想在 Django 中的查询集中添加一个额外的字段。

模型中不存在该字段,但我想将其添加到查询集中。

基本上我想添加一个名为“upcoming”的额外字段,它应该返回“True”

我已经尝试将@property 方法添加到我的模型类。这不起作用,因为显然 django 查询直接访问数据库。

models.py

class upcomingActivity(models.Model):
    title      = models.CharField  (max_length=150)
    address    = models.CharField  (max_length=150)

Views.py

def get(self, request):
    query = upcomingActivity.objects.all()
    feature_collection = serialize('geojson', query ,
                                    geometry_field='location',
                                    fields= ( 'upcoming','title','address','pk' ) 
                                    )

【问题讨论】:

    标签: python django


    【解决方案1】:

    此答案适用于您不想向模型添加虚拟属性(模型保持原样)的情况。

    向查询集结果对象添加附加字段:

    from django.db.models import BooleanField, Value
    
    upcomingActivity.objects.annotate(upcoming=Value(True, output_field=BooleanField())).all()
    

    结果查询集中的每个对象都将具有属性upcoming,布尔值True。 (性能应该不错,因为这对 DB 来说很容易,Django/Python 不需要做太多额外的工作。)

    胡安卡洛斯评论后编辑:

    Django 序列化器用于序列化模型对象,因此默认情况下不会序列化任何非模型字段(因为基本上,这种情况下的序列化器用于加载/转储数据库数据)。

    https://docs.djangoproject.com/en/2.2/topics/serialization/

    Django 的序列化框架提供了一种将 Django 模型“翻译”成其他格式的机制。

    另见:Django - How can you include annotated results in a serialized QuerySet?


    根据我自己的经验:

    在大多数情况下,我们使用json.dumps 在视图中进行序列化,这就像一个魅力。在通过json 转储数据之前,您可以通过注释或处理数据(列表理解等)非常灵活地准备数据以满足任何需要。


    在您的情况下,另一种可能性是在从数据库中获取数据后自定义序列化器或序列化器的输入。

    【讨论】:

    • 这是对所提问题的正确答案。但是我发现序列化程序不会读取额外的字段。正如@Risadinha 建议的那样,需要一个自定义序列化程序才能将自定义字段添加到 django 序列化程序。
    • @JuanCarlos 你是对的。我已添加此信息和指向另一个关于该问题的 SO 问题的链接。
    【解决方案2】:

    您可以使用类函数返回 upcoming 值,如下所示:

    def upcoming(self):
        is_upcoming = # some logic query or just basically set it to true. 
        return is_upcoming
    

    然后按照您的方式在序列化程序中正常调用它。

    fields= ( 'upcoming','title','address','pk' )
    

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2021-04-30
      • 1970-01-01
      相关资源
      最近更新 更多