【问题标题】:How to define django foreign key limit_choices_to constraint which has reference to it's own model?如何定义引用它自己的模型的 django 外键 limit_choices_to 约束?
【发布时间】:2012-06-17 08:50:03
【问题描述】:

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

    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(***?***))

我正在寻找什么可以代替 ?。

【问题讨论】:

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

标签: python django-models foreign-key-relationship limit-choices-to


【解决方案1】:

据我从 OP 的评论中了解到,这个想法是禁止添加重复条目。

但是有一种更安全的方法:

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

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

最初的解决方案只会在管理员中显示过滤器列表,或在表单中,但实际上不会禁止以编程方式添加重复项。

【讨论】:

    【解决方案2】:

    您不能以这种方式执行此操作,但您可以将其作为表单的一部分执行。具体来说,在表单的__init__方法中,可以修改相关字段的查询集。

    我在 Filtering querysets in django.contrib.admin forms 的管理员中写过如何做到这一点

    【讨论】:

      【解决方案3】:

      我以另一种方式做到了这一点,将 FilterValueAdmin 在 admin 中设置为只编辑,并在 FilterAdmin 模型中添加与内联相同的内容。

      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')
      

      【讨论】:

        猜你喜欢
        • 2019-01-14
        • 1970-01-01
        • 2017-04-20
        • 2015-11-29
        • 2015-05-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 2020-05-03
        相关资源
        最近更新 更多