【问题标题】:how to do nested routes drf-extensions django using uuid instead of id如何使用 uuid 而不是 id 来做嵌套路由 drf-extensions django
【发布时间】:2020-09-04 06:14:47
【问题描述】:

我有两个 Django 模型 - 我将在这里更改模型的名称,但想法是一样的。

class Photo(models.Model):
  uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
  image = models.ImageField(upload_to='photos')
  created_at = models.DateTimeField(auto_now_add=True)

class Attachment(models.Model):
  uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
  image = models.ImageField(upload_to='attachments')
  created_at = models.DateTimeField(auto_now_add=True)
  photo = models.ForeignKey(Photo, on_delete=models.CASCADE)

我有意见:

class PhotoViewSet(viewsets.ModelViewSet):
  serializer_class = PhotoSerialzer
  queryset = Photo.objects.all()

class AttachmentViewSet(viewsets.ModelViewSet):
  serializer_class = AttachmentSerializer
  queryset = Attachment.objects.all()

在我的urls.py 文件中:

router = routers.DefaultRouter()
router.register(r'photo', views.PhotoViewSet, 'photo')
router.register(r'attachments', views.AttachmentViewSet, 'attachment')

class NestedDefaultRouter(NestedRouterMixin, routers.DefaultRouter):
  pass

router = NestedDefaultRouter()

photo_router = router.register('photo', views.PhotoViewSet)
photo_router.register('attachments', views.AttachmentViewSet,
                     basename='photo_attachments', parents_query_lookups=['photo'])

我已经构建了一个小应用程序,我可以在其中通过管理员上传图片并将附件图片上传到这些图片并通过 aws 保存。我试过让 Django 自动创建一个主键,但由于某种原因不能很好地工作,即使它确实如此 - 我不记得了,但是,uuid 这不是你可以看到的问题我在我的模型中使用它。

我现在的主要错误是即使我想要这样的网址:

http://127.0.0.1:8000/api/dice/c6e53d17-72ba-4a5f-b72e-26b8b2d25230/attachments/

在检查了我在数据库中的照片的 uuid(uuid 为 c6e53d17-72ba-4a5f-b72e-26b8b2d25230)后,我手动将其输入到地址栏中,它只会获取所有附件(即使是不属于指定照片的附件,使用uuid 在网址中)。

根据这个小教程here 我有几乎相同的设置,而不是id 我有一个uuid。我猜这是问题,但我不确定。我还认为这个视图集有问题:

class AttachmentViewSet(viewsets.ModelViewSet):
  serializer_class = AttachmentSerializer
  queryset = Attachment.objects.all()

因为我要取回每个附件,而不是附加到特定照片的所有附件。我想我应该使用filter(photo=photo_uuid) 之类的东西,但根据教程,我发现我不必这样做,更不用说我在viewset 中无法访问像photo_uuid 这样的参数,所以怎么会我首先过滤。

重申一下,我的问题是,如果我处理的是 uuid 而不是 id 是我认为这是我的问题(除非它是其他问题),我该如何正确地执行嵌套路由。如果这是我现在必须在我的AttachmentViewSet 中处理的事情,而不是我如何正确地处理filter。也许有 *args**kwargs 但如果是这种情况,我将如何在我的视图集中访问它。

我确实发现我可以做到

def get_queryset(self):
  print(self.kwargs)
  pass

当我打印时,我看到了我想要的内容,并且可以通过过滤返回我想要的内容,但这是实际的做法吗?

【问题讨论】:

    标签: django uuid nested-routes drf-extensions


    【解决方案1】:

    在您的视图集中将lookup_field 设置为'uuid'

    class AttachmentViewSet(viewsets.ModelViewSet):
        lookup_field = 'uuid'
        serializer_class = AttachmentSerializer
        queryset = Attachment.objects.all()
    

    【讨论】:

    • 我试过了,但它不起作用。当我检查我的 self.kwargs 包含的内容时,它只是映射到一个 uuid 的“parent_lookup_photo”,我可以通过我在问题中显示的 get_queryset(self) 访问它。但是仅仅设置lookup_field = 'uuid' 是行不通的。我也尝试将其设置为 lookup_field = 'photo' 以防万一,但没有运气
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2013-07-15
    • 2019-05-28
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多