Как проверить подлинность вставки или возврата ошибки - PullRequest
1 голос
/ 26 мая 2019

Я реализую простой API CRUD с использованием Django + Django rest и у вас есть сомнения. У меня есть две модели:

class Shoe(models.Model):
    _id = models.AutoField(primary_key=True)
    description = models.CharField(max_length=100, null=False, blank=False)
    provider = models.CharField(max_length=100, null=False, blank=False)
    type = models.CharField(max_length=2, choices=TIPO_CHOICES, null=False, blank=False)
    cost_price = models.DecimalField(
            max_digits=6, decimal_places=2, verbose_name = 'Preço de Custo',
            null=False, blank=False
            )
    sale_price = models.DecimalField(
            max_digits=6, decimal_places=2, verbose_name = 'Preço de Venda',
            null=False, blank=False
            ) 

class Stock(models.Model):
    _id = models.AutoField(primary_key=True)
    id_shoe = models.ForeignKey(
            Shoe, on_delete = models.CASCADE, verbose_name = 'shoe', related_name = 'stock')
    size = models.IntegerField(choices=NUMERACAO_CHOICES, null=False, blank=False)
    amount = models.IntegerField(null=False, default=0)

То, что я хочу, это то, что, когда кто-то пытается вставить запас такого размера (определенной обуви), который уже существует, он возвращает ошибку. Я не могу просто быть «уникальным» по параметрам размера. Любые предложения о том, как это сделать?

Ответы [ 2 ]

1 голос
/ 26 мая 2019

если вы используете Django 2.2, вы можете использовать UniqueConstraint вместо unique_together следующим образом:

class Meta:
    constraints = [
        models.UniqueConstraint(fields=['shoe', 'size'], name='give_it_some_name')
    ]

В качестве состояния docs :

Вместо этого используйте UniqueConstraint с параметром ограничений.

UniqueConstraint предоставляет больше функциональных возможностей, чем unique_together.unique_together может устареть в будущем.

1 голос
/ 26 мая 2019

Поскольку вам нужен только один элемент Stock для каждой уникальной комбинации shoe и size, вы можете использовать unique_together [Django-doc] здесь:

class Stock(models.Model):
    shoe = models.ForeignKey(Shoe, on_delete=models.CASCADE, verbose_name='shoe', related_name='stock')
    size = models.IntegerField(choices=NUMERACAO_CHOICES, null=False, blank=False)
    amount = models.IntegerField(null=False, default=0)

    class Meta:
        <b>unique_together = ('shoe', 'size')</b>

Примечание имя ForeignKey обычно не с префиксом или суффиксом id_ или _id, Django автоматически создает "двойное" поле с _id суффикс, в котором хранится первичный ключ указанного значения.

Примечание : Если вы не укажете первичный ключ, Django автоматически создаст его с именем id, поэтому здесь, вероятно, лучше позволить Django реализовать логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...