如何创建相关字段?

时间:2018-06-11 13:27:09

标签: python django django-models

我有一个你看到的模型:

class PriceModel(models.Model):
    name = models.CharField(max_length=12)

PriceModel的ID从1增加。我想添加与id相关的其他字段。比如我希望#PM1#PM2 ...表示#PM + id。

如何创建相关字段?

2 个答案:

答案 0 :(得分:2)

  

我想添加与id相关的其他字段。比如我希望#PM1#PM2 ...表示#PM + id

首先,保证所有数据库系统,id总是增加1。例如,如果数据库使用事务或其他机制,则可能会回滚事务,因此永远不会采用相应的id

如果你想要一些"字段"这总是取决于字段的值(这里是id),那么我认为@property可能是一个更好的主意:

class PriceModel(models.Model):
    name = models.CharField(max_length=12)

    @property
    def other_field(self):
        return '#PM{}'.format(self.id)

现在,如果我们有一些PriceModel,那么some_pricemodel.other_field将返回'#PM123'给定(id123)。好的是,如果id被更改,那么属性也会改变,因为它是每次都根据字段计算的。

一个潜在的问题是我们使用此属性进行查询,因为数据库不知道存在此类属性。但是我们可以定义注释:

from django.db.models import Value
from django.db.models.functions import Concat

PriceModel.objects.annotate(
    other_field=Concat(Value('#PM'), 'id')
).filter(
    other_field__icontains='pm1'
)

答案 1 :(得分:1)

我认为你可以在你的模型序列化器中添加一个特殊字段,而不是在模型中添加一个字段。

class PriceModelSerializer(ModelSerializer):
    ....
    show_id = serializers.SerializerMethodField(read_only=True)


    class Meta:
        model = PriceModel

    def get_show_id(self):
        return '#PM' + self.id