1

这是模型。我需要避免在 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(***?***))

我正在寻找什么可以代替.

4

3 回答 3

1

你不能那样做,但你可以把它作为表单的一部分。具体来说,在__init__表单的方法中,您可以更改相关字段的查询集。

我在 django.contrib.admin 表单中过滤查询集的管理员中写了如何做到这一点

于 2012-06-14T13:11:59.453 回答
1

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

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

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

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

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

于 2012-06-14T15:31:39.380 回答
0

我以另一种方式通过在管理员中使 FilterValueAdmin只编辑并在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')
于 2012-06-15T06:48:40.563 回答