1

私は 2 つの 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でした.私のモデルでそれ。

私の主なエラーは、次のようなURLが必要な場合でも、次のとおりです。

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

データベースにある写真のuuidを確認した後、アドレスバーに手動で入力しました(uuidは です)すべての添付ファイルを取得します( URLc6e53d17-72ba-4a5f-b72e-26b8b2d25230の を使用して、指定された写真に属さない添付ファイルも含む)。uuid

この小さなチュートリアルhereによると、ほとんど同じセットアップがあり、代わりiduuid. これが問題だと推測していますが、よくわかりません。私はまた、このビューセットが問題であると考えていました:

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

特定の写真に添付されたすべての添付ファイルではなく、すべての添付ファイルを取得しているということです。私は次のようなものを使用する必要があると考えてfilter(photo=photo_uuid)いますが、チュートリアルによると、それを行う必要がないことがわかりましphoto_uuidviewset

繰り返しますが、私の問題は、id ではなく uuid を扱っている場合、これが私の問題であると信じている場合 (それが何か他のものでない限り)、ネストされたルートを正しく行うにはどうすればよいかということです。それが私が今処理しなければならないものである場合、これ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 に答える