【问题标题】:iterating over a queryset and replacing foreign keys with their related objects django rest framework迭代查询集并用其相关对象替换外键 django rest 框架
【发布时间】:2018-05-05 06:06:10
【问题描述】:

我有以下型号:

class STUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=255)
    ...

class VenuePermissions(models.Model):
    user = models.ForeignKey(STUser, on_delete=models.CASCADE)
    venue = models.ForeignKey(Venue, on_delete=models.CASCADE, blank=True, null=True)
    ...

class Venue(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1500, null=True, blank=True)
    ...

然后我将相关的venuepermission 对象预取到视图中的STUser 对象

class VenueUserList(APIView):
def get(self, request, *args, **kwargs):
  objects = STUser.objects.prefetch_related('venuepermissions_set').all()
   ...

然后我想获取返回的查询集并将venue FK 替换为它们的对象。

 for item in objects:
        for permission in item_venuepermissions_set:
            permission_venue = Venue.objects.get(pk=permission_venue)
    print(repr(objects))
    ...
    return Response({})

但我的方法显然是错误的。如何正确访问查询集的字段并更改其值?

如您所见,我需要做两次。一次访问当前对象权限集,然后再次访问该权限集场地字段并覆盖它。

我不希望任何这些更改数据库。这只是为了返回值。

更新:

我进行了以下更改以访问各个字段:

for item in objects:
            for permission in item.venuepermissions_set:
                permission.venue = Venue.objects.get(pk=permission.venue)
        print(repr(objects))
        return Response({})

我遇到的新错误是:

TypeError: 'RelatedManager' object is not iterable

试图解决

【问题讨论】:

    标签: django django-rest-framework iteration django-queryset prefetch


    【解决方案1】:

    今天回答我所有的问题:

    class VenueUserList(APIView):
        def get(self, request, *args, **kwargs):
            objects = STUser.objects.prefetch_related('venuepermissions_set').all()
            for item in objects:
                for permission in item.venuepermissions_set.all():
                    permission.venue = Venue.objects.get(pk=permission.venue_id)
            return Response({})
    

    就是这样做的方法

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 2015-09-08
      • 2018-10-14
      • 2018-10-09
      • 2021-11-09
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多