django - 在序列化器剩余框架中序列化连接表

标签 django django-rest-framework django-orm

所以我尝试使用 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/

相关文章:

python - Django 创建的 models.py 文件可以被另一个 python 文件用来填充数据库吗?

python - 强制转换为 Unicode : need string or buffer, int found - Django Rest Framework

mysql - 如何在带有django的mysql中的两个不同模式中使用同名的两个表

python - Django annotate() 性能 - 它应该 super 慢吗?

Python Django - 通过 ListView 更新 booleanField

Django ManytoMany 未显示在管理中

python - 在Django中使用haystack/elasticsearch突出显示确切的短语

django rest 权限允许 IsAdmin 和自定义权限

python - DJANGO - 使用 REST 框架在 POST 方法上使用 genericforeignkey 保存数据

postgresql - 如何找到整数的 Django ArrayField 的平均值