【发布时间】:2021-08-30 10:28:50
【问题描述】:
与this question 不同,我不仅要从SerializerMethodField 中读取数据,还要在其中写入数据:
型号:
class Artist(models.Model):
name = models.CharField("name", max_length = 34)
note = models.CharField("additional info", max_length = 128, blank = True, null = True)
class Album(models.Model):
name = models.CharField("name", max_length = 34)
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
序列化器:
class AlbumSerializer(serializers.ModelSerializer):
artist = serializers.SerializerMethodField("get_artist")
def get_artist(self, obj):
return [obj.artist.pk, obj.artist.name, obj.artist.note]
class Meta:
model = Album
lookup_field = "name"
fields = ["name", "artist",]
read_only_fields = ["name",]
视图集:
class AlbumViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
serializer_class = AlbumSerializer
lookup_field = "name"
def get_queryset(self):
return Album.objects.all()
def retrieve(self, request, artist = None):
query = Album.objects.filter(artist = artist)
results = AlbumSerializer(data = query, many = True)
results.is_valid()
return Response(results.data)
def put(self, request, name):
print("------->", name, request)
return Response("test")
从 API 获取数据可以正常工作,但在调用 api/nevermind 时,我会看到所有专辑数据,但在 DRF 的可浏览 API 视图中看不到艺术家的下拉菜单。
urls.py:
router = routers.DefaultRouter()
router.register('albums', views.AlbumViewSet, basename = "albums")
urlpatterns = [
path("", views.ListView.as_view(), name = 'index'),
url('^api/', include(router.urls)),
]
【问题讨论】:
-
分享
urls.py -
我把它加到第一个帖子里了。
-
对不起,我没有正确理解。您希望能够在
artist字段中读写吗?如果是这样,您应该将这两个作为两个序列化程序分开 -
我想要一个 DRF HTML API 中所有艺术家的下拉列表,我可以在其中选择一个进行更新。现在
GET正确返回艺术家,但如果我想更新它,我需要一个所有艺术家的列表,例如从九寸钉移动专辑 -> Nirvana。
标签: django django-rest-framework django-serializer