Как определить ограничение внешнего ключа django limit_choices_to, которое имеет ссылку на свою собственную модель?

Вот модели. Мне нужно избегать ссылки на объекты Filter в модели 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(***?***))

Я ищу что может быть возможным вместо ?,

3 ответа

Решение

Как я понял из комментария ОП, идея состоит в том, чтобы запретить добавление дублирующих записей.

Но есть более безопасный способ сделать это:

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

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

Исходное решение будет просто отображать список фильтров в форме администратора или формы, но фактически не запрещает добавлять дубликаты программно.

Вы не можете сделать это таким образом, но вы можете сделать это как часть формы. В частности, во время __init__ метод формы, вы можете изменить набор запросов связанного поля.

Я написал о том, как это сделать в админке, на странице Фильтрация наборов запросов в формах django.contrib.admin.

Я сделал это по-другому, сделав 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')
Другие вопросы по тегам