我正在尋找Django REST框架中的位置,以便在希望以特定方式格式化查詢結果時進行掛接。查詢結果的自定義JSON表示
也就是說,我想獲取查詢返回的所有行,並使用一些元數據和不同的(嵌套的)結構創建非常特定類型的JSON響應。
看起來,串行器一次只處理一行。自定義視圖是否適合此?
我正在尋找Django REST框架中的位置,以便在希望以特定方式格式化查詢結果時進行掛接。查詢結果的自定義JSON表示
也就是說,我想獲取查詢返回的所有行,並使用一些元數據和不同的(嵌套的)結構創建非常特定類型的JSON響應。
看起來,串行器一次只處理一行。自定義視圖是否適合此?
據我所知你不需要任何鉤子,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現場系列化。
我希望這有助於...(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您可以添加您的記錄的任何自定義值。您可以使用此方法修改您的序列化程序。
要做到這一點的一種方法是覆蓋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
在列表中。