我有一个模特
class myModel(models.Model):
name = models.CharField(max_length=100)
type = models.CharField(max_length=100)
nums = JSONField(null=True, blank=True)
我需要在nums
字段中保存数字。但是,没有两个具有相同myModel
can的type
实例具有相同的数字(nums
字段的交集应该为空)。
我试过为它写一个信号
@receiver(pre_save, sender = myModel)
def check_duplicate_nums(sender, instance, **kwargs):
all_records = myModel.objects.filter(type = instance.type)
for record in all_records:
common_nums = list(set(record.nums).intersection(instance.nums))
if len(common_nums) != 0:
raise Exception("nums "+str(common_nums)+ " are repeated in " +str(record.name)+ " and "+instance.name)
但这样做会打开django admin的调试窗口。我希望错误显示在那里。例如,当我们使用空字段保存模型时,它会在红色突出显示的行中抛出错误“此字段是必需的”。我需要以这种方式显示错误。请建议一个方法。
谢谢!
正如@AnjaneyuluBatta在评论中所说,你可以将这种验证移到表单中。请参阅Adding custom validation to the admin文档。你的admin.py
应该是这样的:
class MyForm(forms.ModelForm):
class Meta:
model = myModel
def clean_nums(self):
# do something that validates your data
nums = self.cleaned_data["nums"]
all_records = myModel.objects.filter(type = instance.type)
for record in all_records:
common_nums = list(set(record.nums).intersection(instance.nums))
if len(common_nums) != 0:
raise forms.ValidationError("nums "+str(common_nums)+ " are repeated in " +str(record.name)+ " and "+instance.name)
return nums
class MyAdmin(admin.ModelAdmin):
form = MyForm
admin.site.register(MyModel, MyAdmin)