如何在python django中将Filefield或Imagefield数据序列化为json数据

时间:2016-11-07 22:45:56

标签: python json django django-rest-framework

我实际上是一个业余的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)

2 个答案:

答案 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中模型类的名称,最后一个是只是您视图的名称。