Джанго: объединить объект и QuerySet? - PullRequest
1 голос
/ 22 марта 2011

Я хочу объединить объект и QuerySet в Django.

Мои объекты выглядят следующим образом:

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)

Мой запрос выглядит следующим образом (я ищу книгу поИдентификатор, а затем найти все книги, которые являются копиями, т.е. поделиться copy_id с library_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 Ответ

1 голос
/ 22 марта 2011

[Редактировать] Если вам не нужен набор запросов:

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_id - library_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)

просмотров.py

from django.db.models import Q
books = Book.objects.filter(Q(id=book_id)|Q(primary_book__id=book_id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...