Как я могу обеспечить уникальность модели Django в зависимости от стоимости? - PullRequest
0 голосов
/ 21 января 2019

Название может вводить в заблуждение, по сути, я хочу знать, как обеспечить уникальность для одного типа атрибута, но не для других. Если у меня есть модель «MyModel», у которой есть связанная модель под названием «Настройки», которая устанавливает определенные атрибуты для MyModel, как я могу гарантировать, что существует только один объект настроек по умолчанию?

Как лучше всего убедиться, что по умолчанию используется только один объект настроек? Я могу указать, что «default» и «related_model» имеют уникальное значение, но это также допускает только один объект настроек, отличный от настроек по умолчанию. Я хотел бы добраться до точки, где у меня может быть только один объект настроек по умолчанию, но нет ограничений на нестандартные объекты.

MyModel
attribute1 = x
...
Settings
related_model = MyModel
default = boolean

1 Ответ

0 голосов
/ 21 января 2019

Хм, я не думаю, что вы можете установить это на уровне БД. Но вы можете сделать это в настройках модели. Допустим, ваша MyModel модель имеет отношение к Settings модели. Как это:

class Settings(models.Model):
    mymodel = models.ForeignKey(Settings, on_delete=models.DO_NOTHING, related_name="attributes")
    default = models.BooleanField(default=False)

Затем в вашей Settings модели вы можете добавить ограничение следующим образом в методе сохранения:

from django.core.exceptions import ValidationError


class Settings(...):
    def save(self, *args, **kwargs):
        query = self.mymodel.attributes.all()
        if self.pk:
            query = query.exclude(pk=self.pk)

        if self.default == True:
           if query.filter(default=True).exists():
               raise ValidationError("Already a default value exists")
        return super(Attribute, self).save(*args, **kwargs)
...