Django: отдельный QuerySet, основанный на связанном поле - PullRequest
0 голосов
/ 11 октября 2011

В моем приложении Django я позволяю пользователям создавать коллекции фильмов по категориям.Это представлено с использованием 3 моделей: «Фильм», «Коллекция» и «Добавление» (модель «Добавление» хранит экземпляры фильма, коллекции и пользователя).Ниже приведены упрощенные версии всех трех моделей.

class Movie(models.Model):
    name = models.CharField(max_length=64)

class Collection(models.Model):
    name = models.CharField(max_length=64)
    user = models.ForeignKey(User)

class Addition(models.Model):
    user = models.ForeignKey(User)
    movie = models.ForeignKey(Movie)
    collection = models.ForeignKey(Collection)

Так, например, пользователь может создать коллекцию под названием «Фильмы 80-х» и добавить фильм «Индиана Джонс» в свою коллекцию.

Мой вопрос: как отобразить отдельный список фильмов на основе набора фильтров запросов?Прямо сейчас я получаю кучу дубликатов для тех фильмов, которые были добавлены в несколько коллекций.Обычно я использовал бы метод Different (), чтобы получить разные объекты, но в этом случае мне нужны разные фильмы, а не отдельные дополнения, но мне нужно запросить модель дополнения, потому что я хочу разрешить пользователю просматривать фильмы, добавленные их друзьями.

Оптимально ли я настраиваю свои модели?Любой совет / помощь будет высоко ценится.

Спасибо!

1 Ответ

1 голос
/ 11 октября 2011

Во-первых.Я не думаю, что вам нужна модель Addition здесь.Вы пытаетесь создать отношение «многие ко многим», но есть документированный способ сделать это:

class Movie(models.Model):
    name = models.CharField(max_length=64)

class Collection(models.Model):
    name = models.CharField(max_length=64)
    user = models.ForeignKey(User)
    movies = models.ManyToManyField('Movie', blank=True, null=True)

Секунда.Документация гласит : «Чтобы сослаться на« обратную »связь, просто используйте имя модели в нижнем регистре».

Итак, ответ (для настройки выше):

Movie.objects.filter(collection__user=user).distinct()
...