我的目标:
当我在admin中添加内联时,要添加该模型对象,则只应允许一个具有特定外键的内联项。
我的模型:
class RateCard(models.Model):
name = models.CharField(max_length=100)
year = models.IntegerField(choices=YEAR_CHOICES, default=timezone.now().year)
class BillingCategory(models.Model):
title = models.CharField(max_length=200)
def __str__(self):
return self.title
class Meta:
verbose_name_plural = "Billing Categories"
class BillingCatagoryRate(models.Model):
billing_category = models.ForeignKey(BillingCategory, on_delete=models.CASCADE)
billing_rate = models.PositiveIntegerField()
rate_card = models.ForeignKey(RateCard,
on_delete=models.CASCADE, blank=True, null=True)
请参阅管理员屏幕截图。
我可以多次选择具有相同值的下拉菜单并成功保存。我需要的是,RateCard只能使用一次BillingCatagory。不多个(如图所示)
我的想法:
在保存期间,也许我们可以检查“结算类别”中是否有重复项。
答案 0 :(得分:0)
这就是我最终解决它的方式。我在admin.py中添加了对ModelAdmin类的检查。
我们需要覆盖“ save_formset ”方法以访问内联值。这就是我的RateCardAdmin的外观。
class RateCardAdmin(admin.ModelAdmin):
model = RateCard
list_display = ('name', 'year')
inlines = [BillingCatagoryRateInline]
def save_formset(self, request, form, formset, change):
ids = []
for data in formset.cleaned_data:
ids.append(data['billing_category'])
common_ids = [item for item , count in collections.Counter(ids).items() if count > 1]
if common_ids:
raise ValidationError('Billing Category Duplicate found')
formset.save()