【发布时间】: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_set的related field。您可以使用字段中的 related_name 参数对其进行自定义。完整说明请看这里:docs.djangoproject.com/en/dev/ref/models/relations -
谢谢。我已经编辑了问题以添加一些上下文。我最终得到的错误向我表明,一个包含 Ride 对象的字段正在进入序列化程序,这就是为什么我不确定我是否真的在取回 User 对象。
-
您似乎使用了错误的模型(用户)和序列化程序(RiderSerializer)的组合。
标签: django many-to-many django-queryset