如何在django中加入2个表

时间:2017-08-28 14:50:43

标签: django postgresql django-models django-queryset

我有2个模特,我想加入

class CollectionBook(models.Model):
    collection = models.ForeignKey('Collection')
    book = models.ForeignKey('Book')

    class Meta:
        unique_together = (('collection', 'book'))


class Book(models.Model):
    main_author = models.ForeignKey('Author', verbose_name=u'Main author')
    publisher = models.ForeignKey('Publisher', verbose_name=u'Publisher')
    title = models.CharField(unique=False, max_length=255, verbose_name=u'Title')
    text = models.TextField(verbose_name=u'Book text', max_length=523000)

我试着这样做

book = Book.objects.extra(
                    select = {'id':'mainapp_collectionbook.book_id'})
book.query.join((None,'mainapp_collectionbook',None,None))

connection = (
      Book._meta.db_table,
      CollectionBook.book.field,
)
book.query.join(connection, promote=True)

但它没有成功并给我错误 你能给我一个解决这个问题的另一个pythonic解决方案或者改进我的做法,我不想写sql查询,我希望有更好的django orm函数用于此

2 个答案:

答案 0 :(得分:1)

从评论中澄清:

  

我有另一张桌子" Collection"。我想要选择书籍所属的集合所在的书籍。我在此查询之前生成了集合列表

首先,使用CollectionBookBook上的ManyToManyField替换您的明确Collection表格。对于此示例,我假设它在Book上,因为这样可以使语法更清晰,并且Collection模型不会显示。

class Book(models.Model):
    main_author = models.ForeignKey('Author', verbose_name=u'Main author')
    publisher = models.ForeignKey('Publisher', verbose_name=u'Publisher')
    title = models.CharField(unique=False, max_length=255, verbose_name=u'Title')
    text = models.TextField(verbose_name=u'Book text', max_length=523000)
    collection = models.ManyToManyField('Collection')

然后您可以使用__语法来关注关系:

Books.objects.filter(collection__in=SOME_LIST_OF_COLLECTIONS).distinct()

如果您需要有关图书/馆藏关系的其他信息,例如EG收集的日期或其他内容,请为ManyToManyField指定through参数。

答案 1 :(得分:0)

如果我理解正确,您可以尝试,但不要忘记更改bindParam

YOU_CONDITION