2015-12-10 49 views
1

我正在尋找Django REST框架中的位置,以便在希望以特定方式格式化查詢結果時進行掛接。查詢結果的自定義JSON表示

也就是說,我想獲取查詢返回的所有行,並使用一些元數據和不同的(嵌套的)結構創建非常特定類型的JSON響應。

看起來,串行器一次只處理一行。自定義視圖是否適合此?

回答

1

據我所知你不需要任何鉤子,DRF默認支持嵌套結果,你只需要根據模型之間的關係以及你希望顯示的方式使用正確的序列化器類。

class ModelASerializer(serializers.ModelSerilizer): 
     modelb = ModelBSerializer(many=True) # case many to many realtionship 

奧德

 modelb = ModelBSerializer(read_only=True) # case foreign key 

所以根據您的需求,您可以使用串行格式化你的反應,也有serializers.DictField,serializers.ListField現場系列化。

檢查Model SerializerField Serializer

2

我希望這有助於...(Django的1.8)

型號:

class Users(AbstractBaseUser): 
    email = models.EmailField(unique=True) 
    username = models.CharField(max_length=100, blank=True) 
    first_name = models.CharField(max_length=100, blank=True) 
    last_name = models.CharField(max_length=100, blank=True) 
    company = models.ForeignKey(Company) 

串行:

class UserListSerializer(serializers.ModelSerializer): 
     company_name = serializers.SerializerMethodField() 
     def get_company_name(self, obj): 
      return obj.company.name 

     class Meta: 
      model = Users 
      fields = ('id', 'email', 'username', 'first_name', 'last_name', 
        'company_name','company') 

隨着SerializerMethodField您可以添加您的記錄的任何自定義值。您可以使用此方法修改您的序列化程序。

2

要做到這一點的一種方法是覆蓋serializers.ListSerializer中的to_representation方法。在serializers.ListSerializer

class CustomListSerializer(serializers.ListSerializer): 

    def to_representation(self, instances): 
     data = [] 
     for instance in instances: 
      field1 = instance.field1 
      field2 = instance.field2 
      data.append({'field1':field1,'field2':field2}) 
     return data 

class YourSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = YourModel 
     list_serializer_class = CustomListSerializer 

to_representation方法轉換對象的實例列表以原始數據類型的類型的字典的列表。

我剛剛向您展示了可以做些什麼的例子。您可以根據您的要求修改to_representation。只要確保您的dictionaries在列表中。