簡體   English   中英

django獲取帶有鏈接外鍵的對象的queryset

[英]django get queryset of a object with chained foreign key

我有一個看起來像這樣的項目:

mysite/
|-- books
|   |-- __init__.py
|   `-- models.py
`-- org
    |-- __init__.py
    `-- models.py

書籍/ models.py:

from django.db import models

from mysite.org.models import Team

class BookSet(models.Model):
    name = models.CharField(max_length=10)
    team = models.ForeignKey(Team, related_name='booksets')

class Book(models.Model):
    name = models.CharField(max_length=10)
    book_set = models.ForeignKey(BookSet, related_name='books')

組織/ models.py:

from django.db import models

class Department(models.Model):
    name = models.CharField(max_length=20)

class Team(models.Model):
    name = models.CharField(max_length=20)
    department = models.ForeignKey(Department, related_name='teams')

我要實現的是獲取部門的所有書籍,類似於:

class Department(models.Model):
    name = models.CharField(max_length=20)

    @property
    def books(self):
        # this won't work, is there any possible do it like this?
        return self.teams.booksets.books()

我知道一種可能的方法是通過:

from mysite.books.models import Book

class Department(models.Model):
    name = models.CharField(max_length=20)

    @property
    def books(self):
        return Book.objects.filter(book_set__team__department=self)

但是使用這種方法,我需要做一些棘手的事情,以允許它們(books.models和org.models)周期性地相互導入。

因此,我想知道是否可以通過查詢外鍵來查找某個部門的所有書籍,例如:

    @property
    def books(self):
        # this won't work, is there any possible do it like this?
        return self.teams.booksets.books()

避免周期性導入的一種簡單方法是使您的Department模型如下:

class Department(models.Model):
    name = models.CharField(max_length=20)

    @property
    def books(self):
        from mysite.books.models import Book
        return Book.objects.filter(book_set__team__department=self)

我認為這樣會起作用:

class Department(models.Model):
    name = models.CharField(max_length=20)

    @property
    def books(self):
        booksets = list(team.booksets.all() for team in self.teams.all())
        return list(bookset.books.all() for bookset in booksets)

但是我沒有簡單的方法來測試它。

編輯:另一種我忘了添加:

您可以使用字符串來引用ForeignKey定義中的模型。 像這樣:

class BookSet(models.Model):
    name = models.CharField(max_length=10)
    team = models.ForeignKey('org.Team', related_name='booksets')

然后在其他應用程序中,您可以自由導入books.models

有關更多信息,請參閱文檔

您可以使用Django用於加載外鍵的相同機制,例如

user = models.ForeignKey('User')

怎么做的:

from django.db.models.loading import get_model
Book = get_model('books', 'Book')

# which would achieve the same thing as
# from books.models import Book

get_model定義為:

def get_model(self, app_label, model_name, seed_cache=True): ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM