2011-03-21 73 views
1

我想在Django中組合一個對象和一個QuerySet。Django:組合一個對象和一個QuerySet?

我的目標如下:

class Book(models.Model): 
    title = models.CharField(max_length=400) 
    library_id = models.FloatField(max_length=200, null=True, blank=True, unique=True) 
    copy_id = models.FloatField(max_length=200, null=True, blank=True) 

我的查詢如下(我找了一本書的ID,然後發現是複製所有的書籍,即與此library_id共享copy_id書:

primary_book = Book.objects.get(id=book_id) 
    book_copies = Book.objects.filter(copy_id=primary_book.library_id) 
    if book_copies: 
     books = primary_book | book_copies 
    else: 
     books = primary_book 

也許有更好的方法來運行查詢,但此刻我有點卡住,因爲這是生產TypeError: unsupported operand type(s) for |: 'Book' and 'QuerySet'

謝謝。

回答

1

[編輯]如果你不需要查詢集:

books = [primary_book] + list(book_copies) 

你可以嘗試,如果你確實需要一個QS使用此:

primary_books = Book.objects.filter(id=book_id) 
book_copies = Book.objects.filter(copy_id=primary_books[0].library_id) 
if book_copies: 
    books = primary_books | book_copies 
else: 
    books = primary_books[0] 

或者,如果你想重做模型因爲它看起來像你的copy_idlibrary_id是多對一的關係:

models.py

class Book(models.Model): 
    library_id = models.FloatField(max_length=200, null=True, blank=True, unique=True) 
    title = models.CharField(max_length=400) 
    primary_book = models.ForeignKeyField('self', to_field='library_id', related_name='book_copies', null=True, blank=True) 

views.py

from django.db.models import Q 
books = Book.objects.filter(Q(id=book_id)|Q(primary_book__id=book_id)) 
+0

的是,在第二個例子中,你首先需要獲取primary_book - 這裏,所以沒有收穫可言。如果你想確切地說,代碼應該是:books = [primary_book] + list(book_copies)[order有時確實很重要] :) – Jerzyk 2011-03-21 22:47:15

+0

以前沒有碰到過'[listify]',謝謝。 – AP257 2011-03-22 08:47:24

相關問題