2013-04-23 52 views
0

说我有以下车型(任意)记录:查询集只得到一个为每个外键

class Manufacturer(Model): 
    name = models.CharField(max_length=255) 
    origin = models.CharField(max_length=255) 

class Car(Model): 
    model = models.CharField(max_length=255) 
    manf = models.ForeignKey(Manufacturer, related_name="cars") 

然后我想运行下面的查询:

usa_manfs = Manufacturer.objects.filter(origin='USA') 
usa_manf_cars = Car.objects.filter(manf__in=usa_manfs) 

不过我只会喜欢在QuerySet中为每个制造商安装1辆汽车。

我知道我可以去其他路线,并做类似usa_manfs.cars[0]但是这不意味着我需要为每个制造商查询以获得所有相关车辆?为了澄清,我不需要任何控制关于每个制造商检索哪个Car实例。我只需要最终列出制造商独特的汽车列表。

解NOW

想来想去,我决定去一个Python的解决方案,并防止在循环重复。

我正在使用的数据很可能在ForeignKey字段中有相对较少的重复项(在这个例子中我的示例可能不支持),并且因为我无法获得解决方案以保持它Django ORM,我将简单地跟踪ForeignKey并在循环中排除重复。无论如何,因为我正在循环它们,所以我认为我没有创造更多的工作。

例如为:

cars = list(Car.objects.all()) 
final_list = [] 
used_before = [] 

for car in cars: 
    if not car.manf_id in used_before: 
     used_before.append(car.manf_id) 
     doStuff(car) 
     final_list.append(car) 

如果一个更好的解决方案走来,我会接受的吧。

+0

为什么不只是得到所有的'汽车'?一辆车只能有1个制造商吗? – 2013-04-23 07:43:58

+0

我不希望重复制造商,所有汽车不能保证。 – DanH 2013-04-23 07:57:41

回答

0

我不知道如何用orm做到这一点。能告诉我们如何能够通过直接的SQL实现它:

from django.db import connection 
cursor = connection.cursor() 

cursor.execute("select c.model from myapp_car c, myapp_manufacturer m where m.origin='USA' and m.id=c.manf_id group by m.id") 
1

I simply need to end up with a list of Cars wherein the Manufacturer is unique.

如何使用distinct

cars = Car.objects.order_by('manf').distinct('manf') 

由于上述仅支持PostgreSQL的,你必须解决它:

m = Manufacturer.objects.all() 

cars = [] 
for i in m: 
    if Car.objects.filter(manf=i).exists(): 
     cars.append(Car.objects.filter(manf=i).order_by('?')[1]) 

这会给你一个随机的汽车为每个制造商。

+0

这确实听起来像我想要的,但尝试它我得到:'NotImplementedError:DISTINCT ON字段不支持此数据库后端'。我假设MySQL或我的版本不支持它。 – DanH 2013-04-23 08:03:20

+1

不幸的是它只支持PostgreSQL。 – 2013-04-23 10:01:26