Django模型,如何制作两个可选字段,但是当一个字段被填充时,另一个字段也必须被填充

时间:2019-12-30 18:32:47

标签: django django-models

因此,我创建了一个具有一些属性的模型,但我想重点关注这两个属性。

class Profile(models.Model):
    RANK_OPTIONS = (
        ('A', 'A'),
        ('B', 'B'),
    )
    related_office = models.ForeignKey('OtherModule.office', 
        related_name='office',
        on_delete=models.CASCADE
    )
    rank = models.CharField(('rank'),max_length=1, choices=RANK_OPTIONS)

基本上,我需要这两个属性是可选的,但在填充属性“ Rank”的那一刻,则还必须填充属性related_office。 您可以有一个related_office而不是一个Rank,但是一旦有了Rank,就还需要一个相关的Office。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以通过覆盖for(Runnable process : processes) { process.run();// You can other fancy stuff here. new Thread(process).start(); // eg : spawn in new thread. } 方法来强制执行这种条件:

save

答案 1 :(得分:1)

我不会在管理保存方法中执行此操作。如果在您的管理员中,请编写一个ModelForm并将其传递给您的管理员类,如下所示:

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = "__all__"

    def clean(self):
        cleaned_data = super().clean()
        if cleaned_data.get("rank") and not cleaned_data.get("related_office"):
            raise ValidationError('You have to select your related office for your rank')

        return cleaned_data

并在您的管理类中引用该表格:

class ProfileAdmin(admin.ModelAdmin):
    form = ProfileForm

如果您有自定义的html模板,请在前端或后端对其进行验证。就像上面的例子一样

答案 2 :(得分:1)

您只需在模型中覆盖clean方法即可。

def clean(self):
    if self.rank and not self.related_office:
        raise ValueError({'related_office':["related_office is required!"]})