gpt4 book ai didi

python - Django 通用外键排序

转载 作者:行者123 更新时间:2023-11-28 22:38:36 25 4
gpt4 key购买 nike

所以我有一个模型与其他三个模型具有通用外键关系

class Status(BaseRequestStatus):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')

class Request(models.Model):
name = models.CharField(max_length=50, db_index=True)
...some fields
statuses = GenericRelation(Status, related_query_name='request')

class AnotherRequest(models.Model):
name = models.CharField(max_length=50, db_index=True)
...some fields
statuses = GenericRelation(Status, related_query_name='another_request')

class ThirdRequest(models.Model):
name = models.CharField(max_length=50, db_index=True)
...some fields
statuses = GenericRelation(Status, related_query_name='third_request')

所以目前我在表格中显示带有名称的状态。我希望能够按名称排序。目前我正在这样排序。

Status.objects.all().order_by('request__name', 'another_request__name', 'third_request__name')

然而,使用这种方法,所有“请求”都按 block 排序,然后是“another_request”,然后是“third_request”

有没有办法把所有这些放在一起?我能够通过将其转换为列表来做到这一点。但在这种情况下,我需要使用查询集。

在此先感谢您的帮助。

最佳答案

如果您希望以相同的方式对待它们(从您希望它们按其共同的 name 字段排序这一事实推断出这一点),那么这表明这些模型具有相同的基础。

在这种情况下,使用模型继承和一个抽象的基本模型,并定义了 name 字段和通用 fkey 关系。

class RequestBase(models.Model):
name = models.CharField(max_length=50, db_index=True)
statuses = GenericRelation(Status, related_query_name='request')

class Meta:
abstract = True

class Request(RequestBase):
# ... more fields

Status.objects.all().order_by('request__name')

更一般的解释:为了能够按一个属性对对象进行排序,您必须弄清楚它们都共享相同的属性。通过在您自己的例程中获取值并创建可排序的列表(这将是您提到的 qs 方法)或通过创建通用接口(interface) - 这就是模型继承方法。

但是,只要您不使用表继承,就不能使用数据库进行排序(意思是:您不能使用 Django ORM 进行排序)。

当然还有其他方法,包括那些在 Django 模型之外的方法:例如生成一个额外的查找结构,如搜索索引,它将根据需要包含您的转换数据(例如 haystack 索引)。

关于python - Django 通用外键排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35463386/

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