gpt4 book ai didi

django - 在 property=value 上过滤/排序 django Rest api,但 property 是一个值而不是一个字段

转载 作者:行者123 更新时间:2023-12-01 21:28:48 25 4
gpt4 key购买 nike

考虑一个具有多个属性的对象。

class Object(models.Model):
name= Charfield(max_length=80)

class Property(models.Model):
object= ForeignKey(Object, related_name='properties')
name= Charfield(max_length=80)
value= Charfield(max_length=80)

我想为对象模型提供一个 api 可访问的 ListView ,但我无法按属性值对 ObjectList 进行排序,也无法按属性值对 ObjectList 进行排序。

为了使示例更加具体,您可以想象对象具有 book 类型,并且 book 的对象除其他属性外还具有名称为 title 的属性和诸如 之类的值海底 20,000 里。我希望能够指定 ?order_by=title 并能够过滤 ?title__contains=League (或至少 ?title="海底 20,000 里”.

我已经尝试使用 title="20,000 Leagues Under the Sea" 注释对象,并且我能够在 ObjectSerializer 中显示标题,就好像它是一个字段一样,但然后按该字段不起作用。

最佳答案

考虑您想要完成的任务以及它如何映射到 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 构建上面的查询并不简单。原因是,通过将属性名称和值作为数据引入而不是将数据写入特定字段,您将破坏引用特定属性的能力。您不能简单地将书名称为特定字段,因为它不是一个字段。如果书没有“书名”属性(property)记录怎么办?如果有多个怎么办?

你可以使用 ORM API 中的 Subquery() 函数来做你想做的事情,但我从未亲自使用过它,所以我不确定它的确切语法是什么。大概是这样的

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

也就是说,这是脆弱且难以推理的,您可能需要重新考虑您的数据库架构。

关于django - 在 property=value 上过滤/排序 django Rest api,但 property 是一个值而不是一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com