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 实例进行任何控制。我只需要最后列出制造商唯一的汽车列表。

现在的解决方案

经过深思熟虑,我决定采用 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)

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

4

2 回答 2

1

我只需要得到一个唯一Cars的 列表。Manufacturer

如何使用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])

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

于 2013-04-23T07:40:57.287 回答
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")
于 2013-04-23T07:35:39.690 回答