我实际上是一个业余的python程序员,我正在尝试将django框架用于Android应用程序后端。一切都还可以,但我的问题实际上是如何将文件中的图像传递给JSON。我已尝试使用SerializerMethodField,如其余框架文档中所述,但无法正常工作。对不起,如果这个问题偏离正轨,但我非常需要帮助。
这是来自我的序列化程序类
class DealSerializer(serializers.ModelSerializer):
class Meta:
model = Deal
image = serializers.SerializerMethodField()
fields = [
'title',
'description',
'image'
]
def get_image(obj):
return obj.image.url
这是我的观点
class DealList(APIView):
def get(self, request):
deals= Deal.objects.all()
serializer = DealSerializer(deals, many=True)
return Response(serializer)
答案 0 :(得分:0)
做这样的事情:
class PhotoSerializer(serializers.ModelSerializer):
class Meta:
model = Photo
read_only_fields = ('created_on', 'updated_on')
class PhotoViewSet(CreateListModelMixin, viewsets.ModelViewSet):
serializer_class = PhotoSerializer
queryset = Photo.objects.all()
def ref_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/ref/<id>/
return 'ref/{0}/{1}'.format(instance.ref.id, filename)
class Photo(models.Model):
image = models.ImageField(upload_to=estates_directory_path)
caption = models.CharField(max_length=50, blank=True)
description = models.TextField(blank=True)
ref_model = models.ForeignKey(MyModel, on_delete=models.CASCADE,
related_name="pictures")
def __str__(self):
return self.caption
在引用的模型序列化器中:
class MyModelSerializer(serializers.HyperlinkedModelSerializer):
url_apprise = serializers.HyperlinkedIdentityField(
view_name='estate-assess')
location_info = LocationInfoSerializer(many=True, read_only=True)
photos = PhotoSerializer(many=True, read_only=True)
class Meta:
model = Estate
read_only_fields = ('created_on', 'updated_on')
答案 1 :(得分:0)
好的..我已经设法修复它,现在可以将文件字段和所有其他字段序列化为json数据。这是代码。 来自我的serializer.py。
class DealSerializer(serializers.ModelSerializer):
class Meta:
model = Deal
fields = ('title', 'description', 'image')
来自我的views.py文件。
class DealViewSet(viewsets.ModelViewSet):
queryset = Deal.objects.all()
serializer_class = DealSerializer
这个技巧发生在urls.py中。我使用的是“路由器”,它是rest_framework附带的一个类。它会在后台为您创建自定义视图,您只需添加一个指向该视图的网址即可。所以你做这样的事情
router = routers.DefaultRouter()
router.register('deals', DealViewSet, 'deals')
urlpatterns = [
url(r'^api/', include(router.urls)),]
路由器有3个参数,第一个是url的前缀(所以我的情况是'api / deals'),第二个是views.py中模型类的名称,最后一个是只是您视图的名称。