gpt4 book ai didi

python - Django QuerySet order_by 字符串评估

转载 作者:太空宇宙 更新时间:2023-11-03 19:31:09 25 4
gpt4 key购买 nike

我尝试根据查询集中的对象作为字符串进行评估的方式对查询集进行排序。

所以我的模型看起来像这样:

class System(models.Model):
operating_system = models.CharField(...)
language = models.CharField(...)
locale = models.CharField(...)

def __unicode__(self):
def __clean(orig, new):
if orig is None or orig == "":
if new is None or new == "":
return ""
else:
return str(new)
else:
if new is None or new == "":
return str(orig)
else:
return str(orig) + " " + str(new)
name = None
for attr in System._meta.fields:
if attr.name != "id":
name = __clean(name, getattr(self, attr.name))
for m2mfield in System._meta.many_to_many:
for object in getattr(self, m2mfield.name).all():
name = __clean(name, object)

if name == "":
return "Undefined"
return name

而且,我希望能够进行如下查询:

System.objects.filter(...).order_by('__unicode__')

我想知道是否有办法在没有自定义管理器的情况下执行此操作。

谢谢!

最佳答案

__unicode__中,您最终会得到一个代表系统对象的字符串。不要每次需要时都计算它,而是计算一次并将其保存到模型中。

class System(models.Model):
operating_system = models.CharField(...)
language = models.CharField(...)
locale= models.CharField(...)
name = models.CharField(editable=False, ...)

def save(self, *args, **kwargs):
self.name = self._calculate_name()
super(System, self).save(*args, **kwargs)

def __unicode__(self):
return self.name

def _calculate_name(self):
# all that string manipulation and relationship stuff

现在您可以通过此名称轻松订购

System.objects.filter(...).order_by('name')

这种方法有一些注意事项,它实际上取决于 System.另外,不要担心空间,这是我的观点!

<小时/>

扩展警告

由于该字段是“非规范化”的,因此它会遇到与其他未规范化的关系数据相同的问题。 Denormalization可能会引入更新异常(如果更改是通过系统以外的其他途径发生的,则name所依赖的字段或关系可以在不更改name的情况下进行更改code> 模型的 save() 方法。它还会减慢写入速度(在这种情况下可能会减慢很小的量),它会增加空间需求(在我看来这也不是问题),并且我确信 Google 很乐意告诉您一大堆其他内容。

我认为您需要注意的是在应该更新时更新.name,因此请仔细考虑在什么条件下您的“清理”代码会产生不同的结果。例如,如果您有一个操作系统表,您可以在其中更改操作系统的描述而无需触摸系统表,那么您必须意识到您的 .name 不会通过保存到操作系统而更新,这将需要重新计算。有一些机制可以帮助解决这个问题,例如信号和重写更多 save() 方法。您还可以根据需要批量更新它们。

这实际上在很大程度上取决于您的用例,此处未完全说明。如果您更完整地展示您的用例,那么这里有很多人可以帮助您缩小最佳解决方案的范围。

关于python - Django QuerySet order_by 字符串评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839372/

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