2013-08-06 100 views
1

我遇到了rest-framework的问题我甚至不确定这是否是正确的方式。我有以下型号django-rest忽略某些对象的某些字段

class Post(models.Model): 
    user = models.ForeignKey(User) 

    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    date = models.DateTimeField(auto_now=True) 

    show = models.BooleanField(default=True) 

    title = models.CharField(max_length=100, blank=True, null=True) 
    body = models.TextField(null=True, blank=True) 
    role = models.IntegerField(max_length=1, choices=POST_OPTIONS, default=1) 
    image = models.ImageField(upload_to="photos", blank=True, null=True) 
    s3Url = models.URLField(blank=True, null=True) 
    tags = TaggableManager() 

而对于其余部分的框架

class PostSerializer(serializers.HyperlinkedModelSerializer): 
    image_url = serializers.Field(source='get_imgage_url') 
    image_file = serializers.ImageField() 
    role = serializers.Field(source='get_role') 

    class Meta: 
     model = Post 

     fields = ('url', 'user', 'created', 'updated', 'date', 'show', 'title', 'body', 'role', 'image_url', 'image') 
     read_only_fields = ('user', 'created', 'updated') 

以下串行所以有2种职位..一个图像和文本后。如果帖子中没有图像,我不想显示图像或image_url。

我无法弄清楚如何使rest-framework做到这一点。

感谢您的帮助!

+1

一种选择是编写两个不同的串行器。在你的视图中,你可以重写get_serializer_class()方法来根据是否有图像进行选择。 –

+0

谢谢..我不知道这个功能,所以我会看看它 – Mike

回答

3

是的,get_serializer_class()方法很容易覆盖。以下是我如何使用它作为特殊的串行器,如果它是一个获取请求。把它扔进模型视图。

def get_serializer_class(self): 
    if self.request.method == "GET": 
     return ProductGetSerializer 
    return ProductSerializer 
+1

我不认为这是正确的解决方案。它不区分基于对象,只是http方法。具体来说,这对列表请求不起作用。 – Mar0ux