2017-08-28 53 views
0

我有2個車型,我想加入如何加入在Django 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函數爲此

+0

請問,你想要什麼邏輯查詢設置數據? –

+0

我有另一個表「集合」。我想要選擇哪本書所屬的館藏在允許的收藏列表中。我在這個查詢之前生成集合列表 – User

回答

0

如果我und erstand正確,你可以嘗試一下,但不要忘記改變YOU_CONDITION

allow_collections = CollectionBook.objects.filter(YOU_CONDITION) 
books_pks = allow_collections.values_list('book__pk', flat=true) 

Book.objects.filter(pk__in=books_pks) 
1

從註釋以澄清:

我有另一個表「收集」。我想要選擇哪本書所屬的館藏在允許的收藏列表中。我這個查詢

首先產生之前收集名單,以ManyToManyField在任BookCollection更換您的明確CollectionBook表。在這個例子中,我假設它在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收集什麼日期,指定一個through參數傳遞給ManyToManyField