簡體   English   中英

在單個get()請求中顯示兩個相關模型

[英]Displaying two related models in a single get() request

我有兩個使用user_id相互關聯的模型,現在我想要一個get請求,在該請求中我將同時擁有兩個表中的字段。 如何做到這一點? 我想用foreign key是可能的,但是我怎么實現呢。

兩種模型如下所示:

模型1

class Account(AbstractBaseUser):
    fullname = models.CharField(max_length=100, blank=True)
    username = models.CharField(unique=True, max_length=50)
    email = models.EmailField(unique=True)
    phonenumber = models.IntegerField(null=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    is_admin = models.BooleanField(default=False)
    objects = AccountManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

型號2

class Profile(models.Model):
    User = get_user_model()
    branch = models.CharField(max_length=20, null=True)
    year = models.IntegerField(null=True)
    image = models.ImageField(upload_to="accounts/images/", null=True, blank=True)
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=False,
        null=True
    )

我想根據當前登錄的用戶顯示特定的用戶詳細信息。

我的get請求看起來像這樣:

def get(self, request, format=None):
        current_user = request.user
        acc = Account.objects.filter(pk=current_user.pk)
        serializer = AccountSerializer(acc, many=True)
        return Response(serializer.data)

但這將僅顯示Account模型的數據,我也需要Profile模型的數據。 我該怎么做?

更新資料

序列化器

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True)
    token = serializers.CharField(max_length=500, read_only=True)

    class Meta:
        model = Account
        fields = (
        'id', 'email', 'username', 'date_created', 'date_modified',
        'fullname', 'password','phonenumber' ,'token' )
        read_only_fields = ('date_created', 'date_modified')

    def create(self, validated_data):
        return Account.objects.create_user(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.username = validated_data.get('username',
        instance.username)
        instance.fullname = validated_data.get('fullname',
        instance.fullname)
        password = validated_data.get('password', None)
        instance.save()
        return instance

更新2

獲得要求后,我想要類似的東西:

{
   "username": "Steve"
   "fullname": "Steve Smith"
   "phonenumber": "1234567890"
   "email": "st@gmail.com"
   "profile":[ {
    "branch": "CS"
    "year": 4
    "image": path/to/folder
   }]
}
class ProfileSerializer(ModelSerializer):
    user = AccountSerializer(read_only=True)

    class Meta:
        model = Profile
        fields = '__all__'


def get(self, request, format=None):
        try:
            profile= Profile.objects.get(user=request.user)
        except Profile.DoseNotExist:
            return Response('404')
        serializer = ProfileSerializer(profile)
        return Response(serializer.data)

這將返回如下數據:

{
   "your profile fields": "xxx"
   ...
   "user": {
    "your user fields": "xxx"
    ...
   }
}

如果您希望用戶信息包括個人資料信息:

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True)
    token = serializers.CharField(max_length=500, read_only=True)
    profile = serializers.SerializerMethodField()

    class Meta:
        model = Account
        fields = (
        'id', 'email', 'username', 'date_created', 'date_modified',
        'fullname', 'password','phonenumber' ,'token' )
        read_only_fields = ('date_created', 'date_modified')

    def create(self, validated_data):
        ...

    def update(self, instance, validated_data):
        ...

    def get_profile(self, instance):
        try:
            profile= Profile.objects.get(user=instance)
            return ProfileSerializer(profile).data
        except Profile.DoseNotExist:
                return ''

要么:

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True)
    token = serializers.CharField(max_length=500, read_only=True)
    profile = serializers.ProfileSerializer(read_only=True)

    class Meta:
        model = Account
        fields = (
        'id', 'email', 'username', 'date_created', 'date_modified',
        'fullname', 'password','phonenumber' ,'token' )
        read_only_fields = ('date_created', 'date_modified')

    def create(self, validated_data):
        ...

    def update(self, instance, validated_data):
        ...

這將返回:

{
   "username": "Steve"
   "fullname": "Steve Smith"
   "phonenumber": "1234567890"
   "email": "st@gmail.com"
   "profile":{
    "branch": "CS"
    "year": 4
    "image": path/to/folder
   }
}

因為您的個人資料對用戶來說是一對一的,所以個人資料是JsonObject而不是JsonArray

像這樣配置您的AccountSerializer

class ProfileSerializer(serializers.ModelSerializer):        
    class Meta:
        model = Profile
        fields = [f.name for f in model._meta.fields]

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True)
    token = serializers.CharField(max_length=500, read_only=True)
    profile = ProfileSerializer()
    class Meta:
        model = Account
        fields = [f.name for f in model._meta.fields]

您還可以相應地覆蓋序列化程序的createupdate方法。

暫無
暫無

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

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