django多對一和多對多的序列化


(以下方式只用於序列化,反序列化報錯)

1.models表

from django.db import models
# Create your models here.

class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.IntegerField()
    pub_date=models.DateField()
    publish=models.ForeignKey("Publish")
    authors=models.ManyToManyField("Author")


    def __str__(self):
        return "app02 %s" % self.title

    class Meta:
        app_label='app02'


class Publish(models.Model):
    name=models.CharField(max_length=32)
    email=models.EmailField()


    def __str__(self):
        return "app02 %s" % self.name

    class Meta:
        app_label = 'app02'

class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    def __str__(self):
        return "app02 %s" %self.name

    class Meta:
        app_label = 'app02'

2.多對一和多對多的序列的方式(方式一)

class AuthorSerializers(serializers.Serializer):
name=serializers.CharField()
age=serializers.IntegerField()

class Publishser(serializers.Serializer):
name=serializers.CharField(max_length=32)
email=serializers.EmailField()
class BookSerializers(serializers.Serializer):
id=serializers.IntegerField()
title=serializers.CharField()
price=serializers.IntegerField()
pub_date=serializers.DateField()

# 多對一
# source = "publish.email"
# 可以指定model中的函數,也可以指定字段
# 這種方式不使用於多對多,適用於一對一和多對一,而且這種方式只序列化一個值
# publish=serializers.CharField(source="publish.name",read_only=False)
# 多對一序列化多個值的寫法
publish = Publishser()

# 多對多
authors=serializers.SerializerMethodField()
# 鈎子函數序列化,必須是以get_開頭的
def get_authors(self,obj):
author=obj.authors.all()
auth=AuthorSerializers(author,many=True)
return auth.data
 

3.多對一和多對多的序列的方式(方式二)

class AuthorSer(serializers.ModelSerializer):
    class Meta:
        model=models.Author
        fields='__all__'


class Publishser(serializers.ModelSerializer):
    class Meta:
        model=models.Publish
        fields='__all__'
class BookModelSerializers(serializers.ModelSerializer):
#多對一 publish
= Publishser() # 多對多 authors = serializers.SerializerMethodField() # 鈎子函數序列化,必須是以get_開頭的 def get_authors(self, obj): author = obj.authors.all() auth = AuthorSerializers(author, many=True) return auth.data class Meta: model=models.Book fields='__all__'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM