Как создать соответствующее поле? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть модель, которую вы видите ниже:

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

Идентификатор PriceModel увеличен с 1.Я хочу добавить другое поле, которое относится к id.Например, я хочу, чтобы #PM1, #PM2 ... означало #PM + id.

Как создать соответствующее поле?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Я хочу добавить другое поле, которое относится к id.Например, я хочу, чтобы #PM1, #PM2 ... означает #PM + id.

Прежде всего, это не гарантировано, что для Для всех систем баз данных значение id всегда увеличивается на единицу.Например, если база данных работает с транзакциями или другими механизмами, возможно, что транзакция откатывается, и, следовательно, соответствующий id никогда не берется.

Если вам, однако, нужно какое-то «поле», которое всегдазависит от значения поля (здесь id), тогда я думаю, что @property, вероятно, является лучшей идеей:

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

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

Так что теперь, если у нас есть PriceModel, тогда some_pricemodel.other_fieldвернет '#PM123' заданное значение (id равно 123).Приятно то, что если id изменяется, то свойство также будет меняться, поскольку оно каждый раз рассчитывается на основе полей.

Потенциальная проблема заключается в том, что мы можем не делает запросы с этим свойством, так как база данных не знает, что такое свойство существует.Однако мы можем определить аннотацию:

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

PriceModel.objects.<b>annotate(
    other_field=Concat(Value('#PM'), 'id')
)</b>.filter(
    other_field__icontains='pm1'
)
0 голосов
/ 11 июня 2018

Я думаю, вы можете добавить в сериализатор вашей модели специальное поле, а не добавить поле в модель.

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


    class Meta:
        model = PriceModel

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