如何允许带有外键的内联模型仅使用一次?

时间:2019-02-20 10:59:22

标签: django

我的目标:

当我在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。不多个(如图所示)

我的想法:

在保存期间,也许我们可以检查“结算类别”中是否有重复项。

enter image description here

1 个答案:

答案 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()