2011-03-21 5 views
1

Je veux combiner un objet et un QuerySet dans Django.Django: combiner un objet et un QuerySet?

Mes objets sont les suivants:

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) 

Ma requête est la suivante (je suis à la recherche un livre par ID, puis de trouver tous les livres qui sont des copies, par exemple partager un copy_id avec le library_id de cette livre:

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 

peut-être il y a une meilleure façon d'exécuter la requête Mais au moment où je suis un peu coincé, parce que c'est la production TypeError: unsupported operand type(s) for |: 'Book' and 'QuerySet'

?.

Merci.

Répondre

1

[Modifier] Si vous ne souhaitez pas queryset:

books = [primary_book] + list(book_copies) 

Vous pouvez essayer d'utiliser si vous avez besoin d'un 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] 

Ou si vous vouliez refaire votre modèle car il ressemble à votre copy_id à library_id est un beaucoup à une relation:

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

encore, dans le deuxième exemple, vous devrez chercher primary_book premier - donc pas de gain ici du tout. si vous voulez être exact, le code devrait être: books = [primary_book] + list (book_copies) [l'ordre est parfois important] :) – Jerzyk

+0

N'a pas rencontré '[listify]' avant, merci. – AP257