select_related несколько таблиц - PullRequest
0 голосов
/ 07 июня 2018

У меня есть 3 модели:

class book(models.Model):
    id = models.AutoField(primary_key=True)
    publisher= models.ForeignKey(Publisher, related_name='publisher')
    def __str__(self):
        return str(self.publisher)
    def __repr__(self):
        return str(self.publisher.id)
class reader(models.Model):
    publisher= models.ForeignKey(Publisher)
class publisher(models.Model):
    date = models.DateTimeField()

Я пытаюсь получить всех читателей, которые читают конкретную книгу, у меня нет связи между читателем и книгой, только через таблицу издателя, я пытался получить этоинформация с: Book.object.select_related (publisher__readers__id = 'x'), но я получаю ошибку.Можно получить информацию из нескольких таблиц, как моя модель?спасибо

1 Ответ

0 голосов
/ 07 июня 2018

Я чувствую, что ваш код немного странный, если вы следуете рекомендациям Django, параметрам related_name и некоторому пониманию того, что вы хотите сделать, это должно быть что-то вроде:

class Book(models.Model):
    publisher = models.ForeignKey(Publisher, related_name='books')


class Reader(models.Model):
    publisher = models.ForeignKey(Publisher, related_name='readers')


class Publisher(models.Model):
    date = models.DateTimeField()

И тогда у вас есть:

book = Book.objects.get(pk='<book_pk>')
readers = book.publisher.readers.all()
# or just
readers = Reader.objects.filter(publisher__books__pk='<book_pk>')

Ваше отношение выглядит странно, потому что вы создаете отношение между Reader и Publisher вместо того, чтобы делать это с самим Book.Вы должны создать отношение ManyToMany между Reader и Book, выполнив такой сценарий, в котором: «Читатель читает книги, и несколько читателей могут читать одну и ту же книгу».Сегодня ваш код означает что-то вроде: «Чтение связано с издателем, что означает, что этот читатель прочитал все книги издателя», я не вижу в этом большого смысла, извините.

...