如何在创建新模型期间获取ForeignKey字段值?

2024-06-08 12:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找在Django模型中实现这种机制的最有效的方法。 假设有两个非常简单的模型:

class FKModel(models.Model):
    value = BooleanField()

class AModel(models.Model):
    fk = models.ForeignKey(FKModel)
    a_value = models.CharField(max_length=150)

    def clean(self, *args, **kwargs):
        # the line below is incorrect
        if not self.fk.value:    # <--- how to do this in a proper way?
            raise ValidationError('FKModel value is False')
        super(AModel, self).clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(AModel, self).save(*args, **kwargs)

我知道,我可以做一些类似FKModel.objects.all()/.get()的事情,但我认为这不是最好的解决方案(因为它需要对数据库的额外请求)


Tags: 模型selfcleanmodelisvaluemodelsdef
1条回答
网友
1楼 · 发布于 2024-06-08 12:44:47

我不确定您试图在clean()方法中做什么,但我假设您正在尝试为外键约束一个NOTNULL条件。默认情况下,所有字段都不受null约束,如果希望字段接受null,则必须设置null=Falseblank=False

class AModel(models.Model):
    fk = models.ForeignKey(FKModel, null=True, blank=True)
    a_value = models.CharField(max_length=150)

如果要手动约束字段的NOTNULL条件,应按如下方式执行:

class FKModel(models.Model):
    value = BooleanField()

class AModel(models.Model):
    fk = models.ForeignKey(FKModel)
    a_value = models.CharField(max_length=150)

    def clean(self, *args, **kwargs):
        # the line below is correct
        if self.fk is None:    # < - this is the proper way?
            raise ValidationError('FKModel value is False')
        super(AModel, self).clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(AModel, self).save(*args, **kwargs)

要检索数据库记录及其相关记录,请使用“预回迁相关记录”(prefetch_related),并在一次数据库点击中获取记录及其相关记录:

AModel.objects.all().prefetch_related('fk')

相关问题 更多 >