vikkyshostak
@vikkyshostak
< This head full of dreams.

Django. Как исключить из FK поля инлайновой модели нужные значения?

Приветствую.

Django 2.0.3, Python 3.6.1.

Подскажите, пожалуйста, как исключить (сделать фильтр) из QuerySet поля инлайновой модели нужные значения?

Вот мой код:

# ./app/models.py

class Product(models.Model):
    name = models.CharField(max_length=255)

class Color(models.Model):
    name = models.CharField(max_length=255) # ['blue', 'red', 'yellow'] для примера

class Price(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    color = models.ForeignKey(Color, on_delete=models.CASCADE)
    price = models.PositiveSmallIntegerField()


# ./app/admin.py

class PriceInlineAdmin(admin.TabularInline):
    model = Price

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('id',)
    inlines = [
        PriceInlineAdmin
    ]

Собственно, как в инлайн-модели PriceInlineAdmin исключить из поля color (которое отображается, как select, ибо ForeignKey) запись со значением blue?

Буду рад толковым советам.
Заранее спасибо!
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
TheDeadOne
@TheDeadOne
Седой и строгий
Из документации:
class PriceInlineAdmin(admin.TabularInline):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'color':
            kwargs['queryset'] = Color.objects.all().exclude(name='blue')
        return super().formfield_for_foreignkey(db_field, request, **kwargs)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
В класс PriceInlineAdmin добавь форму.
В классе формы:
def __init__(self, *args, **kwargs):
  super(PriceForm, self).__init__(*args, **kwargs)
  self.fields['color'].queryset = Color.objects.filter(~Q(name="blue"))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы