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)
我想要的是,当某人尝试插入已经存在的(某种鞋子)尺寸的股票时,它将返回错误。我不能只是大小参数的“唯一性”。有关如何执行此操作的任何建议?
答案 0 :(得分:1)
由于每个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:
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。