簡體   English   中英

如何在沒有嵌套在 Django rest 框架中的情況下獲得 relate model?

[英]How to get relate model without nested in Django rest framework?

如何獲得json與 relate model 但沒有嵌套在 Django rest 框架中?

代碼:

Models, Session and Athlete , Athlete模型與Session有外鍵關系

class Session(models.Model):
    Id = models.AutoField(primary_key=True)
    SessionNo = models.SmallIntegerField()
    WinTeam = models.SmallIntegerField(null=True)

class Athlete(models.Model):
    Id = models.AutoField(primary_key=True)
    Name = models.CharField(max_length=6)
    Age = models.SmallIntegerField()
    Session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='athletes')
    Status = models.SmallIntegerField()

序列化器

class SessionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Session
        fields = '__all__'

class AthleteSerializer(serializers.ModelSerializer):
    Session = SessionSerializer(read_only=True)

    class Meta:
        model = Athlete
        fields = ('Age', 'Status', 'Session')

和意見:

def all_athletes(request):
    """
    Get all athletes list
    """
    queryset = Athlete.objects.all().select_related()
    serializer = AthleteSerializer(instance=queryset, many=True)
    return Response(serializer.data)

而 API 結果是:

[
    {
        "Age": 38,
        "Status": 1,
        "Session": {
            "Id": 13,
            "SessionNo": 1,
            "WinTeam": null
        }
    },
    {
        "Age": 26,
        "Status": 1,
        "Session": {
            "Id": 13,
            "SessionNo": 1,
            "WinTeam": null
        }
    },
    {
        "Age": 35,
        "Status": 2,
        "Session": {
            "Id": 13,
            "SessionNo": 1,
            "WinTeam": null
        }
    }
]

它可以獲取 relate model,但我想要 relate models show without nested ,如何滿足我的期望?

我期待 API 結果:

[
    {
        "Age": 38,
        "Status": 1,
        "Id": 13,
        "SessionNo": 1,
        "WinTeam": null
    },
    {
        "Age": 26,
        "Status": 1,
        "Id": 13,
        "SessionNo": 1,
        "WinTeam": null
    },
    {
        "Age": 35,
        "Status": 2,
        "Id": 13,
        "SessionNo": 1,
        "WinTeam": null
    }
]

您可以嘗試 SerializerMethodFields....

class AthleteSerializer(serializers.ModelSerializer):
    Id = serializers.SerialierMethodField(read_only=True)
    SessionNo = serializers.SerialierMethodField(read_only=True)
    WinTeam = serializers.SerialierMethodField(read_only=True)

    class Meta:
        model = Athlete
        fields = ('Age', 'Status', 'Id', 'SessionNo', 'WinTeam')
    
    def get_Id(self, obj):
        return obj.Session.id
    
    def get_SessionNo(self, obj):
        return obj.Session.SessionNo
    
    def get_WinTeam(self, obj):
        return obj.Session.WinTeam

然后記得在視圖的查詢集中預取 Session 關系,否則它會針對這些多個字段多次訪問數據庫

您也可以覆蓋 AthleteSerializer 中的AthleteSerializer to_representation() 這樣你就不需要SerialierMethodField

def to_representation(self, value):
   ref = super().to_representation(value)
   session = ref.pop("Session")
   ref.update(**session)
   return ref

暫無
暫無

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

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