gpt4 book ai didi

django - 在序列化器休息框架中序列化连接表

转载 作者:行者123 更新时间:2023-12-05 04:06:40 25 4
gpt4 key购买 nike

所以我正在尝试使用 Django 序列化程序序列化多个连接表。我找不到办法做到这一点。正在执行的查询是原始 sql。型号如下

class UserDetail(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE)
mobile_number = models.IntegerField()
national_id = models.CharField(max_length = 30)
date_created = models.DateTimeField(auto_now_add = True)
address = models.CharField(max_length = 250)
merchant_name = models.CharField(null = True, max_length = 30)

class Account(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE)
account_number = models.BigIntegerField()
balance = models.FloatField()
account_type = models.ForeignKey(AccountType, on_delete = models.CASCADE)

预期结果的 json 应该如下所示

{
"userdetail": {
"mobile_number":""
},
"account": {
"account_number":""
},
"user": {
"first_name": "",
"last_name": "",
"email":""
}
}

原始sql查询如下

queryset = Account.objects.raw('''SELECT auth_user.first_name,
auth_user.id,
auth_user.last_name,
auth_user.email,
authentication_userdetail.mobile_number,
authentication_account.account_number
FROM
public.auth_user,
public.authentication_account,
public.authentication_userdetail
WHERE
auth_user.id = authentication_userdetail.user_id
AND
auth_user.id = authentication_account.user_id
''')

如果有不使用原始 sql 的替代方法,我将不胜感激,因为我不喜欢使用 django ORM 执行原始 sql 查询

尝试使用此解决方案,但我似乎无法理解查询集的序列化方式 Cross-table serialization Django REST Framework

已编辑

class UserDetailSerializer(serializers.ModelSerializer):

class Meta:
model = UserDetail
fields = ('mobile_number',)

class AccountSerializer(serializers.ModelSerializer):

class Meta:
model = Account
fields = ('account_number',)


class AccountInfoSerializer(serializers.ModelSerializer):
user_detail = UserDetailSerializer()
account = AccountSerializer()
user = serializers.SerializerMethodField()

class Meta:
model = User
fields = ('user_detail', 'account', 'user')
def get_user(self, obj):
return {
'first_name': 'obj.first_name',
'last_name': 'obj.last_name',
'email': 'obj.email',
}

View 代码

serializer_class = AccountInfoSerializer

def get_queryset(self, *args, ** kwargs):
user_id = self.request.query_params.get('user_id', None)
queryset = None
if user_id is not '':
queryset = UserDetail.objects.raw()
return queryset

最佳答案

你可以尝试这样的解决方案:

from rest_framework import serializers

class UserDetailSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetail
fields = ('mobile_number',)


class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ('account_number',)


class UserSerializer(serializers.ModelSerializer):
userdetail = UserDetailSerializer()
account = AccountSerializer()
user = serializers.SerializerMethodField()

class Meta:
model = User
fields = ('userdetail', 'account', 'user')

def get_user(self, obj):
return {
'first_name': 'obj.first_name',
'last_name': 'obj.last_name',
'email': 'obj.email',
}

关于django - 在序列化器休息框架中序列化连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49650720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com