Django将外键组合在一个查询集中

时间:2018-03-12 17:31:28

标签: python django postgresql django-models django-queryset

我在Django应用程序中有一个模型,被其他多个模型作为ForeignKey引用。

我正在寻找的方法是为这个类的所有对象创建一个单个查询集,其他类根据某些标准被外键引用。

我甚至不确定这是否可行,但无论如何我都想过要问。

class Person(models.Model):
    pass


class Book(models.Model):
    year_published = models.PositiveIntegerField()
    author = models.ForeignKey(Person)


class MusicAlbum(models.Model):
    year_published = models.PositiveIntegerField()
    producer = models.ForeignKey(Person)

recent_books = Book.objects.filter(year_published__gte=2018)
recent_music_albums = MusicAlbum.objects.filter(year_published__gte=2018)

# How can I create a **single** queryset of the Person objects that are being referenced as `author` in `recent_books` and as `producer` in `recent_music_albums`?

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

目前我没有Django在我面前,但是如下所示:

class Person(models.Model):
    pass


class Book(models.Model):
    year_published = models.PositiveIntegerField()
    author = models.ForeignKey(Person, related_name='books')


class MusicAlbum(models.Model):
    year_published = models.PositiveIntegerField()
    producer = models.ForeignKey(Person, related_name='albums')

Person.objects.filter(books__year_published__gte=2018, albums__year_published__gte=2018)

或者,如果你不得不做前两个查询,

Person.objects.filter(books__in=recent_books, albums__in=recent_music_albums)

答案 1 :(得分:1)

对于PersonBookMusicAlbum个模型实例将book_set RelatedManager。可能他们仍然会有默认名称musicalbum_setpersons_books = person.book_set.all() persons_musicalbums = person.musicalbum_set.all() ,因为您没有覆盖它们。

您可以使用这些来查找与一个人实例相关联的图书/音乐专辑:

qs = Person.objects.exclude(book=None).exclude(musicalbum=None)

同样,您可以从模型管理器生成相关的查询集:

x = 0
x = "zero"

答案 2 :(得分:0)

同样可以实现:

person = Person.objects.latest('book__year_published', 'musicalbum__year_published')








personList = Person.objects.all().order_by('-book__year_published', '-musicalbum__year_published')