我已经花了很多时间来处理ManyToMany字段类型的查询集。
我想通过在GET
上使用model B
来model A
个对象(filter
)与另一个对象(model A
)具有多对多关系。
views.py
我从my_user_id
的{{1}}获得了urls.py
。
str
部分工作正常,但是...
id
urls.py
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = User.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
return self.queryset.filter(user_id=id).user_schedules.all()
models.py
path('user/<str:my_user_id>', views.UserUserId.as_view()),
它给了我以下错误:
AttributeError:“ QuerySet”对象没有属性“ user_schedules”
我试图通过将class User(models.Model):
user_id = models.TextField(blank=True, null=True)
user_schedules = models.ManyToManyField('Schedule',
related_name='%(class)s_id')
class Schedule(models.Model):
sched_id = models.IntegerField(blank=True, null=True)
sched_name = models.TextField(blank=True, null=True)
放在[0]
的末尾来解决此问题,但是这似乎是错误的,并且如果我必须检查多个User对象,这是行不通的。
那么如何获取filter()
为user_schedules
的特定User
的{{1}}列表?
我坚持了几个小时,任何帮助将不胜感激。
答案 0 :(得分:3)
您想获取实例的数据,但是您的代码正在尝试从查询集获取数据。
以下几行应为您提供帮助:
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = User.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
user = User.objects.get(id=id)
return list(user.user_schedules.all())
答案 1 :(得分:2)
首先,我认为您可能希望使用其他序列化器(类似SchedulerSerializer
),因为您建议您要序列化Schedule
。
您可以使用给定的Schedule
来获得User
的所有user_id
:
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = Schedule.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
return self.queryset.filter(user__user_id=id)
因此,我们在Schedule
模型上进行查询,并进行过滤,以便我们检索与相关 {{ 1}}和Schedule
。