我有两个 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
url 中的指定照片的附件)。
根据这里的这个小教程,我有几乎相同的设置,而不是id
我有一个uuid
. 我猜这是问题,但我不确定。我还认为这个视图集是一个问题:
class AttachmentViewSet(viewsets.ModelViewSet):
serializer_class = AttachmentSerializer
queryset = Attachment.objects.all()
因为我要取回每个附件,而不是附加到特定照片的所有附件。我想我应该使用类似的东西,filter(photo=photo_uuid)
但根据教程,我发现我不必这样做,更不用说我无法访问我的一些参数photo_uuid
,viewset
所以我首先将如何过滤。
重申一下,我的问题是,如果我正在处理 uuid 而不是 id 是我认为这是我的问题(除非它是其他问题),我该如何正确地执行嵌套路由。如果这是我现在必须处理的事情,而AttachmentViewSet
不是我如何正确filter
处理。也许有*args
,**kwargs
但如果是这样的话,我将如何在我的视图集中访问它。
我确实发现我可以做到
def get_queryset(self):
print(self.kwargs)
pass
当我打印时,我看到了我想要的内容,并且可以通过过滤返回我想要的内容,但这是实际的做法吗?