python - 向 django 查询添加虚拟字段

标签 python django

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

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

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

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

模型.py

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

View .py

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

最佳答案

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

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

from django.db.models import BooleanField, Value

upcomingActivity.objects.annotate(upcoming=Value(True, output_field=BooleanField())).all()

生成的查询集中的每个对象都将具有 bool 值 True 的属性 upcoming。 (性能应该很好,因为这对于数据库来说是很容易的工作,并且 Django/Python 不需要做太多额外的工作。)

胡安·卡洛斯评论后编辑:

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

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

Django’s serialization framework provides a mechanism for “translating” Django models into other formats.

另请参阅:Django - How can you include annotated results in a serialized QuerySet?


根据我自己的经验:

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


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

关于python - 向 django 查询添加虚拟字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57355467/

相关文章:

python - GeoDjango 查询 : all point that are contained into a multi polygon

python - SSL 错误发生在一台计算机上,但另一台计算机上没有?

python - 在 mako 中,如何循环列表并显示每个值?

Python 矩阵提供了 numpy.dot()

python - 第一次测试后 Selenium 测试失败

python - Model.ManyToManyField.all() 给出 AttributeError : 'ManyToManyDescriptor' object has no attribute 'all'

python - Django 运行服务器错误 : unsupported operand type(s) for +=: 'NoneType' and 'str'

django 脆皮表单标签覆盖不起作用

python - 检查排列 python 上排列出现的行号

python - pip install pcapy 无法打开包含文件 'pcap.h'