Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 选择多个相关的表_Django_Python 3.x_Django Forms_Django Select Related - Fatal编程技术网

Django 选择多个相关的表

Django 选择多个相关的表,django,python-3.x,django-forms,django-select-related,Django,Python 3.x,Django Forms,Django Select Related,我有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(s

我有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()
我试图让所有读过某本书的读者,我在读者和书之间没有联系, 仅通过publisher表,我试图通过以下方式获取此信息:Book.object.select\u related(publisher\uu readers\uu id='x') 但我犯了个错误。 有可能从多个表中获取信息,比如我的模型?
谢谢

我觉得你的代码有点奇怪,如果你遵循Django的良好实践,
相关的\u 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>')
book=book.objects.get(pk='')
readers=book.publisher.readers.all()
#或者只是
readers=Reader.objects.filter(publisher\u books\u pk='')

你的关系看起来很奇怪,因为你是在
读者
出版商
之间建立关系,而不是在
本身上建立关系。你应该在
Reader
Book
之间建立
manytomy
关系,这样你就有了这样一个场景:“一个读者阅读书籍,多个读者可以阅读同一本书。”。今天,您编写的代码的意思是:“阅读与出版商有关,这意味着读者阅读了所有出版商的书籍”,对不起,我看不出这有什么意义。

我觉得您的代码有点奇怪,如果您遵循Django的良好实践,
相关的\u 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>')
book=book.objects.get(pk='')
readers=book.publisher.readers.all()
#或者只是
readers=Reader.objects.filter(publisher\u books\u pk='')

你的关系看起来很奇怪,因为你是在
读者
出版商
之间建立关系,而不是在
本身上建立关系。你应该在
Reader
Book
之间建立
manytomy
关系,这样你就有了这样一个场景:“一个读者阅读书籍,多个读者可以阅读同一本书。”。今天,您编写的代码的意思是:“阅读与出版商相关,这意味着该读者阅读了所有出版商的书籍”,对不起,我看不出这有什么意义。

如果您需要帮助跟踪错误,请显示实际代码和您收到的错误。下面的答案清楚地显示了设置代码的更好方法,但我也看到了一些其他问题<代码>Book.object应该引发属性错误,因为它应该是
Book.objects
。另外:
select\u related
实际上并不获取任何内容,它只是将Queryset设置为在您实际执行查询时执行预取。如果您需要帮助跟踪错误,请显示实际代码和正在获取的错误。下面的答案清楚地显示了设置代码的更好方法,但我也看到了一些其他问题<代码>Book.object应该引发属性错误,因为它应该是
Book.objects
。另外:
select\u related
实际上并不获取任何内容,它只是将Queryset设置为在实际执行查询时进行预取。