Django фильтрует много для многих полей в admin?

У меня есть три объекта:

Thing
  some fields

Bucket
  things = models.ManyToManyField(Thing)

User
  buckets = models.ManyToManyField(Bucket)
  things = models.ManyToManyField(Thing)

При редактировании поля "Bucket" в администраторе я хочу иметь возможность выбирать "Вещи", но только те вещи, которые находятся в списке "Вещи" для пользователя, который в настоящий момент вошел в систему.

Как я могу это сделать? Другими словами, как я могу отфильтровать список вещей в администраторе Bucket?

Благодарим вас за помощь заблаговременно.

Ответы

Ответ 1

Прочитайте документы:

class BucketAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "things":
             kwargs["queryset"] = Things.objects.filter(...)
        return super(BucketAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Ответ 2

Существует formfield_for_manytomany. Использование похоже на ответ, заданный defuz.

ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶

Как и метод formfield_for_foreignkey, метод formfield_for_manytomany можно переопределить, чтобы изменить default formfield для многого поля. Например, если владелец может владеть несколькими автомобилями, а автомобили могут принадлежать нескольким владельцам - многие для многих отношений - вы можете отфильтровать поле внешнего ключа Car для отображаются только автомобили, принадлежащие Пользователю:

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "cars":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)