Python Queryset仅为每个外键获取一条(任意)记录

Python Queryset仅为每个外键获取一条(任意)记录,python,django,django-1.4,Python,Django,Django 1.4,假设我有以下型号: 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="ca

假设我有以下型号:

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每个制造商有一辆车

我知道我可以走另一条路,做一些类似于
usa\u manfs.cars[0]
的事情,但是这不意味着我需要查询每个制造商以获得所有相关的汽车吗

为了澄清,我不需要任何关于每个制造商的控制来检索哪个汽车实例。我只需要最后列出一个制造商独特的汽车列表

目前的解决方案

经过深思熟虑,我决定采用Python解决方案,并防止循环中出现重复

我正在处理的数据在ForeignKey字段上可能有相对较少的重复项(在我的示例中可能不起作用),并且由于我无法获得一个将其保持在Django ORM中的解决方案,因此我将简单地跟踪ForeignKey并排除循环中的重复项。因为我无论如何都在循环它们,所以我不认为我总体上创造了更多的工作

e、 g:


如果有更好的解决方案,我会接受的。

我不确定我们如何使用orm。可以告诉我们如何通过direct 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")
我只需要得到一个
汽车列表
,其中
制造商是唯一的

如何使用:

由于上述内容仅在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])

这将为每个制造商提供一辆随机的汽车。

为什么不直接获得所有的
汽车
?一辆车只能有一个制造商,对吗?我不想要重复的制造商,这是所有车都无法保证的。这听起来正是我想要的,但是我尝试了一下:
NotImplementedError:DISTINCT ON fields不受此数据库后端的支持。
。我假设MySQL或者我的版本不支持它。不幸的是,它只在PostgreSQL上受支持。
cars = Car.objects.order_by('manf').distinct('manf')
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])