如何验证插入或返回错误

时间:2019-05-26 18:58:59

标签: django

im使用Django + Django REST实现了一个简单的API CRUD,对此有疑问。 我有两种型号:

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 个答案:

答案 0 :(得分:1)

由于每个Stockshoe的唯一组合只需要一个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:
        unique_together = ('shoe', 'size')
  

注意ForeignKey的名称通常不是前缀或后缀id__id,Django会自动创建一个带有_id后缀的“ twin”字段,用于存储引用值的主键。

  

注意:如果您未指定主键,则Django会自动创建一个名为id的主键,因此让Django实现逻辑可能更好。

答案 1 :(得分:1)

如果您使用的是Django 2.2,则可以这样使用UniqueConstraint而不是unique_together

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

作为docs状态:

  

改为将UniqueConstraint与constraints选项一起使用。

     

UniqueConstraint提供的功能比unique_together还要多。将来可能不推荐使用unique_together。