Как определить ограничение внешнего ключа 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')