Подумайте, что вы пытаетесь выполнить, и как оно сопоставляется с запросами SQL (использование ORM удобно, но вы всегда должны помнить, что все ваши вызовы ORM переводятся в SQL).У вас есть стол books
, и у вас есть стол properties
.Допустим,
create table books (
id integer primary key,
);
create table properties (
id integer primary key,
name text,
value text,
book_id integer,
)
И затем вы вставляете записи, подобные этой
insert into books set (id) values (1);
insert into properties set (id, name, value, book_id) values (1, 'title', 'A Book', 1)
И затем вы хотите получить книги и названия, чтобы в итоге получилось что-то вроде
select b.id, p.value as "title"
from books as b
join properties as p on (b.id = p.book_id)
where p.name = 'title'
order by p.value
К сожалению, построение запроса выше с использованием ORM не тривиально.Причина этого заключается в том, что, вводя имя свойства и значение в виде данных вместо записи данных в определенное поле, вы подрываете свою способность ссылаться на конкретные свойства.Вы не можете просто ссылаться на название книги как на конкретное поле, потому что это не поле.Что если в книге нет записи свойства title?Что если у него более одного?
Вы можете делать то, что хотите, используя функцию Subquery () из ORM API, но я никогда не использовал ее лично, поэтому я не уверен, каков точный синтаксис для этогобыло бы.Возможно, что-то вроде этого
title = Property.objects.filter(name='title', book_id=OuterRef('pk')).values('value')[:1]
books = Object.objects.annotate(title=Subquery(title)).order_by('title')
https://docs.djangoproject.com/en/2.2/ref/models/expressions/#subquery-expressions
Тем не менее, это хрупко и сложно рассуждать, и вы можете пересмотреть архитектуру вашей базы данных.