PostgreSQL上的Django QuerySets包含重复的对象

时间:2012-11-29 10:51:52

标签: python django postgresql

这是在OSX上运行的Django 1.4.2,带有PostgreSQL数据库。

这是我的模特:

class RideRequest(models.Model):
    user = models.ManyToManyField(User, related_name="ride_requests", symmetrical=False)
    status = models.IntegerField(choices=STATUS_CHOICES)

在我对这个模型的所有过滤器调用中,我得到所有对象两次。

[10]: queryset = RideRequest.objects.filter(id=8)
[11]: for q in queryset: print q.id
8
8

我只是查看了数据库,每个条目只出现一次。有什么想法会发生这种情况吗?由于某些数据库约束,我无法轻松切换到SQLite。

编辑:这是RideRequest.objects.filter(id=8).query的原始SQL查询输出。它也返回两行而不是预期的一行。可能是因为正在进行过度的JOINing?

SELECT "rides_riderequest"."id", "rides_riderequest"."ride_id", 
…
FROM "rides_riderequest" 
LEFT OUTER JOIN "rides_riderequest_ride_request_stations" 
ON ("rides_riderequest"."id" = "rides_riderequest_ride_request_stations"."riderequest_id")
LEFT OUTER JOIN "rides_riderequeststation" 
ON ("rides_riderequest_ride_request_stations"."riderequeststation_id" = 
"rides_riderequeststation"."id") WHERE "rides_riderequest"."id" = 8  
ORDER BY "rides_riderequeststation"."departure_time_min" DESC;

1 个答案:

答案 0 :(得分:1)

我怀疑在模型Meta部分中,您已经设置了由“外部”字段(相关模型'station__departure_time')排序的模型。当您编写查询时,django会将连接添加到此“外部”字段以进行排序。

在这种情况下,您应该使用distinct()方法或使用.order_by()

清除排序