为了账号安全,请及时绑定邮箱和手机立即绑定

将虚拟字段添加到 django 查询

将虚拟字段添加到 django 查询

炎炎设计 2022-04-23 17:18:01
我想在 Django 中的查询集中添加一个额外的字段。该字段在模型中不存在,但我想将其添加到查询集中。基本上我想添加一个名为“upcoming”的额外字段,它应该返回“True”我已经尝试将@property 方法添加到我的模型类中。这不起作用,因为显然 django 查询直接访问数据库。模型.pyclass upcomingActivity(models.Model):     title      = models.CharField  (max_length=150)     address    = models.CharField  (max_length=150)视图.pydef get(self, request):     query = upcomingActivity.objects.all()     feature_collection = serialize('geojson', query ,                                     geometry_field='location',                                     fields= ( 'upcoming','title','address','pk' )                                      )
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

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

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

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 - 如何在序列化的 QuerySet 中包含带注释的结果?


根据我自己的经验:

在大多数情况下,我们json.dumps在视图中使用序列化,这就像一个魅力。您可以通过注释或处理数据(列表理解等),然后通过json.


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


查看完整回答
反对 回复 2022-04-23
?
茅侃侃

TA贡献1842条经验 获得超22个赞

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


def upcoming(self):

    is_upcoming = # some logic query or just basically set it to true. 

    return is_upcoming

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


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


查看完整回答
反对 回复 2022-04-23
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号