1

我有两个 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)后,我手动将其输入到地址栏中,它只会获取所有附件(即使是不属于使用uuidurl 中的指定照片的附件)。

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

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

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

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

我确实发现我可以做到

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

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

4

1 回答 1

2

在您的视图中设置lookup_field'uuid'

class AttachmentViewSet(viewsets.ModelViewSet):
    lookup_field = 'uuid'
    serializer_class = AttachmentSerializer
    queryset = Attachment.objects.all()
于 2020-09-04T06:30:39.067 回答