Python Django–;至少需要一个多通模型实例

Python Django–;至少需要一个多通模型实例,python,django,django-models,Python,Django,Django Models,在(首次)保存模型时,是否可能要求模型至少有一个多实例?其想法是,拥有一个可以有价格历史记录的产品(希望使用一个单独的、松散耦合的模型,这是正确的方法);因此,要添加产品,至少需要一个价格。 我读到,将这种验证放入clean比save更明智,因为ValidationError不是从后者产生的,它只是“按惯例更好”。不过,对于这两种方法,我们还不能100%确定界限在哪里 目前正试图让它与Django管理员一起工作;代码如下所示 # models.py class Product(models.Mo

在(首次)保存模型时,是否可能要求模型至少有一个多实例?其想法是,拥有一个可以有价格历史记录的产品(希望使用一个单独的、松散耦合的模型,这是正确的方法);因此,要添加产品,至少需要一个价格。
我读到,将这种验证放入
clean
save
更明智,因为
ValidationError
不是从后者产生的,它只是“按惯例更好”。不过,对于这两种方法,我们还不能100%确定界限在哪里

目前正试图让它与Django管理员一起工作;代码如下所示

# models.py
class Product(models.Model):
    name: str = models.CharField(max_length=128)

    def clean(self):
        if self._state.adding:
            if not self.prices.count():
                raise ValidationError({
                'prices': ('At least one product price is required'),
            })

class ProductPrice(models.Model):
    product: Product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='prices')
    price: float = models.FloatField()
    created: datetime = models.DateTimeField(auto_now_add=True)


# admin.py
class ProductPriceInline(admin.TabularInline):
    readonly_fields = ('created',)
    model = ProductPrice
    extra = 3
    can_delete = False

@admin.register(Product)
class ProductInline(admin.ModelAdmin):
    model = Product
    verbose_name = 'Product'
    inlines = [ProductPriceInline,]
获取
ValueError ProductForm没有名为prices的字段。我也尝试过在
产品上使用约束(
模型.CheckConstraint(check=~Q(prices=None),name='ather_least_1_non_null'),]
),但我真的被所有不同的解决方案所淹没,找到了正确的解决方案和/或找到了如何解决当前解决方案的问题。除了这里的主要问题之外,我很高兴有任何建议

编辑:在旁注上–刚刚意识到
clean
方法将始终返回带0的
self.prices.count()
,因为
ProductPrice
实例仅在创建
Product
之后创建,因此前者可以引用