Я хочу добавить другое поле, которое относится к 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'
)