Django:如何选择具有相同字段值的对象?

Django:如何选择具有相同字段值的对象?,django,django-models,Django,Django Models,例如,我有这样一个模型: Class Doggy(models.Model): name = models.CharField(u'Name', max_length = 40) color = models.CharField(u'Color', max_length = 20) 我如何挑选颜色相同的小狗?或同名:) UPD。当然,我不知道名字和颜色。我想。。根据他们的价值观进行分组 UPD2。我正在尝试这样做,但使用Django: SELECT * FROM table

例如,我有这样一个模型:

Class Doggy(models.Model):
    name = models.CharField(u'Name', max_length = 40)
    color = models.CharField(u'Color', max_length = 20)
我如何挑选颜色相同的小狗?或同名:)

UPD。当然,我不知道名字和颜色。我想。。根据他们的价值观进行分组

UPD2。我正在尝试这样做,但使用Django:

SELECT * 
FROM table 
WHERE tablefield IN ( 
 SELECT tablefield
 FROM table 
 GROUP BY tablefield  
 HAVING (COUNT(tablefield ) > 1) 
) 

UPD3。我希望通过Django ORM来实现,而不必迭代对象。我只想为一个特定字段获取具有重复值的行。

如果您要查找某种颜色的Doggy,您可以执行以下操作

Doggy.objects.filter(color='blue')
如果您想根据当前小狗的颜色查找小狗

def GetSimilarColoredDoggys(self):
    return Doggy.objects.filter(color=self.color)
名字也是如此:-

def GetDoggysWithSameName(self):
    return Doggy.objects.filter(color=self.name)

我将更改您的数据模型,使颜色和名称与Doggy的关系为一对多,如下所示:

class Doggy(models.Model):
    name = models.ForeignKey('DoggyName')
    color = models.ForeignKey('DoggyColor')

class DoggyName(models.Model):
    name = models.CharField(max_length=40, unique=True)

class DoggyColor(models.Model):
    color = models.CharField(max_length=20, unique=True)
现在
DoggyName
DoggyColor
不包含重复的名称或颜色,您可以使用它们来选择具有相同名称或颜色的狗。

您可以使用:

import operator
import itertools
from django.db import models

def group_model_by_attr(model_class, attr_name):
    assert issubclass(model_class, models.Model), \
        "%s is not a Django model." % (model_class,)
    assert attr_name in [field.name for field in Event._meta.fields], \
        "The %s field doesn't exist on model %s" % (attr_name, model_class)

    all_instances = model_class.objects.all().order_by(attr_name)
    keyfunc = operator.attrgetter(attr_name)    
    return [{k: list(g)} for k, g in itertools.groupby(all_instances, keyfunc)]

grouped_by_color = group_model_by_attr(Doggy, 'color')
grouped_by_name = group_model_by_attr(Doggy, 'name')
按颜色分组
(例如)将是一个dict列表,如
[{'purple':[doggy1,doggy2],{'pink':[doggy3,]}]
其中doggy1,2等是
Doggy
实例

更新

从您的更新来看,似乎您只需要每个事件类型的ID列表。我在我的ubuntu笔记本电脑上用postgresql中的250k记录测试了这一点,该笔记本电脑配备了core 2 duo和3gb的ram,耗时0.35秒(顺便说一句,itertools.group_耗时0.72秒)要生成dict,您提到您有900K条记录,因此这应该足够快。如果不是,则应该很容易在记录更改时进行缓存/更新

from collections import defaultdict

doggies = Doggy.objects.values_list('color', 'id').order_by('color').iterator()
grouped_doggies_by_color = defaultdict(list)
for color, id in doggies:
    grouped_doggies_by_color[color].append(id)

好吧,显然,只有ORM是不可能做到的


如果必须这样做,您必须使用.extra()来执行所需的SQL语句(当然,如果您使用的是SQL数据库)

我来晚了,但现在您可以:

Doggy.objects.values('color', 'name').annotate(Count('pk'))

这将为您提供一个结果,计算您按颜色和名称分组的每只狗的数量。

Omg,我的问题真的这么不清楚吗?抱歉,我将更新它,以显示颜色/名称未知。顺便说一句,您的命名不符合python的整洁惯例。似乎,您喜欢C:)@Data贪婪:您对Mez的评论是正确的不要用CamelCase代替带下划线的小写字母作为函数名。但是,你在问题中使用的“=”登录关键字参数之间的空格也不符合PEP8。这很公平,但我是征求建议的人。记住,这是一个知识库,如果新手愿意的话接受这个建议,这可能会导致他在代码格式化方面陷入混乱。顺便说一句,将camelCase与lowerecase的第一个字母一起使用不会如此确定。但是,同样,这不是重点。天哪,我不是在问这个问题。例如,这个模型是一个伪模型。真正的问题是找到重复的消息。@Data贪婪:为什么不更改您的data模型是一个有效的选择?因为我这次对DB架构的建议不感兴趣。如果你想了解真实情况:我有一个类似于论坛的地方,我想在那里找到重复的消息,并为版主创建一个关于它们的报告。所以,问题本身是关于使用Django ORM进行特定类型的查询(如果可能的话,当然-我已经尝试了很多方法,但没有使用extra(),结果没有成功)。@datagrade:您的示例Doggy模型(名称和颜色为CharField)将导致冗余数据和非第二正常形式的数据模型。违反2NF会导致浪费存储空间和降低查询性能。如果“真正的问题是发现重复的消息”,然后你应该问你真正的问题,而不是对那些问你实际问题的人投反对票。我对你的答案投了反对票,因为它没有包含对实际问题的答案。你也可以回答类似“不要这样做,找另一个爱好。”",但我不是在征求关于寻找其他嗜好的建议,而不是写django应用程序。我是在问关于使用ORM进行精确查询的确切问题。感谢您的帮助。实际上,我想使用ORM来实现这一点。当然,我可以迭代所有对象,但如果您有超过900k的对象,那就没那么好了……没有p问题。我肯定会在你的问题中提到数据大小。我已经更新了我的答案,我认为这对你有用。谢谢你的回复,我投了更高的票:)但是我会留下问题-我真的想知道上述查询是否可以通过ORM$)第二个基本上是通过ORM完成的,带有一点消息传递数据。仅供参考:我刚刚尝试了w/750k记录,groupby花了48秒,值列表花了22秒。是的,我理解,谢谢,但我仍然对c感兴趣像上面的SQL查询一样构造查询。我会使用.raw()而不是.extra()--这更简单,您可以使用任何想要的SQL并返回Django模型对象。:)是的,这就是应该做的,尽管2011年没有注释;)