如何在视图集使用的Django模型中添加列的自定义行级处理

2024-09-30 08:36:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的模型,例如:

class Lics(models.Model):
    files_id = models.IntegerField(blank=True, null=True)
    seqno = models.IntegerField(blank=True, null=True)
    expire = models.TextField(blank=True)

“expire”字段带有日期。我有一个函数,在调用api时从'now'开始执行delta。调用时如何以及在何处在ViewSet中添加额外字段Lics.objects.all所有()添加为第4个字段,显示'days'=4,例如,如果许可证从现在起4天过期。你知道吗

预期输出:[{files_id:1, seqno:2, expire:'4-jan-2019', 'days':4 }]


Tags: 模型idtruemodelmodelsfilesdaysnull
2条回答

@RishiG有个好办法。另外,还可以创建模型属性。你知道吗

class Lics(models.Model):
    files_id = models.IntegerField(blank=True, null=True)
    seqno = models.IntegerField(blank=True, null=True)
    expire = models.TextField(blank=True)

    @property
    def days(self):
        // calculation code goes here

然后,只需在序列化程序的“fields”参数中包含“days”。你知道吗

class LicSerializer(serializers.ModelSerializer):

class Meta:
    model = Lic
    fields = ('files_id', 'seqno', 'expire', 'days')

我通常根据我想在哪里访问这些数据来决定我的方法。例如,如果我想直接对模型实例的days属性进行操作,我就把它放在模型中。如果我只关心在视图中冒泡这个数据,我就把它放在序列化程序中。你知道吗

我可能会将它添加为SerializerMethodField,以便根据请求计算它。实际上,这与the example in the docs非常相似。您需要以下内容(注意:我没有测试过这个,它只是对文档化示例的一个轻微修改):

from django.utils.timezone import now
from rest_framework import serializers

class LicSerializer(serializers.ModelSerializer):
    days = serializers.SerializerMethodField()

    class Meta:
        model = Lic

    def get_days(self, obj):
        cur_time = now()
        if cur_time > obj.expire:
            return 0
        return (obj.expire - cur_time).days

相关问题 更多 >

    热门问题