Python 如何将django外键限制定义为引用它的约束';她自己的模型?

Python 如何将django外键限制定义为引用它的约束';她自己的模型?,python,django-models,foreign-key-relationship,limit-choices-to,Python,Django Models,Foreign Key Relationship,Limit Choices To,这些是模型。我需要避免在FilterValue模型中引用已经在FilterValue模型中引用的Filter对象 class Filter(models.Model): name = models.CharField('Name', max_length=255) class FilterValue(models.Model): name = models.CharField('Name', max_length=255) fil

这些是模型。我需要避免在FilterValue模型中引用已经在FilterValue模型中引用的Filter对象

    class Filter(models.Model):
        name = models.CharField('Name', max_length=255)

    class FilterValue(models.Model):
        name = models.CharField('Name', max_length=255)
        filter = models.ForeignKey(Filter, limit_choices_to=Q(***?***))

我在寻找什么可以代替

你不能这样做,但你可以作为表单的一部分来做。具体地说,在表单的
\uuuu init\uuu
方法期间,您可以更改相关字段的queryset


我在管理员的

中写到了如何做到这一点,正如我从OP的评论中了解到的,这个想法是禁止添加重复条目

但有一种更安全的方法:

class FilterValue(models.Model):
    name = models.CharField('Name', max_length=255)
    filter = models.ForeignKey(Filter)

    class Meta:
        unique_together = (("name", "filter"),)

最初的解决方案只是在管理中以表单的形式显示过滤器列表,但实际上并不禁止以编程方式添加副本

我以另一种方式完成了这项工作,即在admin中只编辑filtervaluageadmin并在filteradadmin模型中添加与内联相同的内容

class FilterValueInline(admin.StackedInline):
   formset = FilterValueInlineFormset
   model = FilterValue
   max_num = 1
   can_delete = False


class FilterAdmin(admin.ModelAdmin):
   list_display = ('id', 'name')
   inlines = [FilterValueInline]


class FilterValueAdmin(admin.ModelAdmin):
   """Filter value has to be added via the filter table"""
   def has_add_permission(self, request):
       return False
   def has_delete_permission(self, request, obj=None):
       return False
   actions = None
   list_display = ('id', 'name', 'filter')

因此,您希望在将筛选器设置为FilterValue并保存模型时,不再在列表中看到它?这种解决方案的目的是什么?不是添加重复条目。也许我不能正确理解它,但我认为这不是正确的方法。。。