簡體   English   中英

Django Rest框架如何序列化一個關系Model?

[英]Django Rest Framework how to serialize a relational Model?

我正在學習 Django Rest 框架並成功創建了一些 API。 現在我正在嘗試序列化一個關系,但我不知道它是如何工作的。 這是我的代碼:

class Countries(models.Model):
    country = models.CharField(max_length=255)

    class Meta:
        managed = False
        db_table = 'countries'

class Users(models.Model):
    name = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    country = models.ForeignKey(Countries, models.DO_NOTHING)
    date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'users' 

在views.py

def get(self,request):
        print(UsersSerializer)
        users = Users.objects.all()
        serializer = UsersSerializer(users,many = True)
        return Response(serializer.data)

序列化器:

class UsersSerializer(serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = '__all__'

當我運行 API 時,我得到了

[
  {
    "id": 3,
    "name": "dsadasd",
    "email": "dasd@gmail.com",
    "date": "2020-05-12T12:15:24Z",
    "country": 1
  }
]

在國家/地區字段中,我正在獲取國家/地區id ,並且我期待這里的國家/地區名稱......

您需要更改您的UsersSerializer以返回國家/地區名稱 insread 的 id。

class UsersSerializer(serializers.ModelSerializer):
    country = serializers.SerializerMethodField()  # add this line

    class Meta:
        model = Users
        fields = '__all__'

    def get_country(self, instance): return instance.country.country  # return country name

進一步閱讀SerializerMethodField

您可以使用source字段參數來檢索country而不是id

...或者可以使用點符號來遍歷屬性,例如EmailField(source='user.email') 使用點分符號序列化字段時,如果在屬性遍歷期間任何 object 不存在或為空,則可能需要提供默認值。

因此,您的序列化程序應如下所示:

class UsersSerializer(serializers.ModelSerializer):
    country = serializers.CharField(source='country.country', default='')

    class Meta:
        model = Users
        fields = ('id', 'name', 'email', 'date', 'country')
        # You may use fields='__all__' but I find the explicit declaration 
        # more flexible.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM