【问题标题】:Django: Reverse M2M query with a "through" modelDjango:使用“通过”模型反向 M2M 查询
【发布时间】:2015-07-25 09:20:29
【问题描述】:

我有以下设置:

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 Framework 作为 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 对象)的原始问题?

【问题讨论】:

  • 是的,Ride.objects.get(id=ride_id).riders.all() 为您提供了您正在寻找的查询集(当然,该特定行程的所有用户,前提是该行程存在)
  • 为了获得特定用户的所有游乐设施,您可以使用名为 ride_setrelated field。您可以使用字段中的 related_name 参数对其进行自定义。完整说明请看这里:docs.djangoproject.com/en/dev/ref/models/relations
  • 谢谢。我已经编辑了问题以添加一些上下文。我最终得到的错误向我表明,一个包含 Ride 对象的字段正在进入序列化程序,这就是为什么我不确定我是否真的在取回 User 对象。
  • 您似乎使用了错误的模型(用户)和序列化程序(RiderSerializer)的组合。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2020-11-24
    • 2010-10-22
    • 2023-02-17
    • 2014-12-28
    • 2013-01-02
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多