如何使用uuid代替id

问题描述

我有两个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',basename='photo_attachments',parents_query_lookups=['photo'])

我建立了一个小应用程序,可以通过admin上传图片并将附件图片上传到这些图片并通过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)之类的东西,但是根据该教程,我发现我不必这样做,更不用说我在{{ 1}},那么我该如何进行过滤。

再次重申,我的问题是,如果我正在处理uuid而不是id,我该如何正确处理嵌套路由,因为这是我认为是我的问题(除非有其他问题)。如果这是我现在必须在photo_uuid中处理的事情,而不是如何为此正确viewset处理的事情。也许有AttachmentViewSetfilter,但是如果是这样的话,我将如何在我的视图集中访问它。

我确实发现我可以做

*args

当我打印时,我看到了我想要的东西,可以通过过滤返回我想要的东西,但这是实际的方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)