Django:使用"通过"反向M2M查询模型

时间:2015-05-13 21:52:37

标签: django many-to-many django-queryset

我有以下设置:

class Ride(models.Model):
   ...
   riders = models.ManyToManyField(User, through='RideRiders', null=True, blank=True)

   class Meta:
        db_table    = 'rides'
        app_label   = 'rides'


class RideRiders(models.Model):
   user = models.ForeignKey(User)
   ride = models.ForeignKey(Ride)

   # Other information
   ...

   class Meta:
       db_table    = 'rides_riders'
       app_label   = 'rides'

所以,例如,我可以使用以下内容为用户获取所有游乐设施(这实际上是最好的方式吗?):

Ride.objects.filter(riders__id=user_id)

我希望能够让所有用户参与特定的游戏,但似乎无法弄清楚如何。这个RideRiders模型似乎是一个棘手的问题,因为我似乎无法将其超越用户。例如:

Ride.objects.get(id=ride_id).riders.all()

...给出一个RideRider对象列表(我认为)。

有什么建议吗?

编辑: 为了添加更多上下文,我尝试使用Django Rest框架作为API调用来获取特定骑行的骑手。这就是我使用它的方式:

class RideRiders(generics.ListAPIView):
   model = User
   serializer_class = RiderSerializer

   def get_queryset(self):
       return Ride.objects.get(id=self.kwargs.get('id')).riders.all()

但是这正在给我一个错误,这就是我觉得它返回RideRider对象而不是Rider对象的原因。

FieldError: Cannot resolve keyword u'ride' into field. Choices are: date_joined, email, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, user_permissions, username

编辑2: 所以Ride.objects.get(id=self.kwargs.get('id')).riders.all()抛出了上述错误(与序列化器无关)。如果我运行Ride.objects.get(id=self.kwargs.get('id')).rideriders_set.all()然后它返回一个查询集(并且测试给出了任何特定骑行的预期记录数)。那么,这就留下了如何返回用户列表(而不是RideRider对象)的原始问题?

1 个答案:

答案 0 :(得分:0)

在对整个应用程序进行一些重构之后,模型类中的罪魁祸首证明是app_label = 'rides'是不正确的。这显然阻止了Django在模型之间进行正确的查找,因为它们没有被正确注册。