【问题标题】:Django Rest Framework - Nested SerializationDjango Rest Framework - 嵌套序列化
【发布时间】:2022-02-05 08:48:38
【问题描述】:

我在下面列出了模型和序列化器。

型号:

 class CustomGroup(Group):
        description = models.CharField(max_length=150, null=True, blank=True, verbose_name="Human readable name")
    
        def __str__(self):
            return self.description or self.name
    
        class Meta:
            db_table = "groups"
    


class User(AbstractBaseUser, PermissionsMixin):
        """
        Custom user model that supports email.
        """
        groups = models.ManyToManyField(
            CustomGroup,
            verbose_name=('groups'),
            blank=True,
            help_text= (
                'The groups this user belongs to. A user will get all permissions '
                'granted to each of their groups.'
            ),
            related_name="user_set",
            related_query_name="user",
            through="UserGroup"
        )
        email = models.EmailField(max_length=255, unique=True)
        is_active = models.BooleanField(default=True)
        tenant = models.ForeignKey(
            Tenant, on_delete=models.CASCADE, null=True, db_column="tenant_id", blank=True
        )
        ......
        objects = UserManager()
    
        USERNAME_FIELD = "email"
        # REQUIRED_FIELDS = ["tenant_id"]
    
        class Meta:
            db_table = "users"

class UserGroup(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    group = models.ForeignKey(CustomGroup, on_delete=models.CASCADE)
    tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = "user_groups"

序列化器:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = ("first_name","last_name")

class UserGroupSerializer(serializers.ModelSerializer):
    users = UserSerializer(many=True,read_only=True)
    class Meta:
        model = UserGroup
        fields = ('group_id','users')

我想要这样的回应:

    {
      "group_id":
      "users": [
       {
         "first_name": "",
          "last_name":""   
       }
       ...
      ]
    ...
   ]
}

我只得到:

 [{"group_id":1}, ...}]

UserSerializer 如何从 User 模型中序列化所需的用户 ID?由于 user 被定义为 UserGroup 中的外键,它会自动发生吗?还是我错过了用户和用户组之间的任何关系?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您的用户组仅与一个用户和一个组相关联。因此,您将只能直接访问一个用户和一个组。 (你不是在序列化程序中拼错了user 吗?你写的是users

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = get_user_model()
            fields = ("first_name","last_name")
    
    class UserGroupSerializer(serializers.ModelSerializer):
        user = UserSerializer(read_only=True)
        class Meta:
            model = UserGroup
            fields = ('group_id','user')
    

    但这会给你类似的东西

    {
        "group": "<group_pk>",
        "user": {
            "first_name": "first_name",
            "last_name": "last_name"
        }
    }
    
    

    如果您想将特定组与所有相关用户相关联,则需要一些不同的东西。您需要检索链接到具有当前用户组的 group_id 的用户组的所有用户。

    class UserGroupSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = UserGroup
            fields = ('group_id', )
    
        def to_representation(self, instance):
            data = super().to_representation(instance)
            related_users = get_user_model().objects.filter(usergroup__group=instance.group)
            data['users'] = UserSerializer(instance=related_users, many=true).data
            return data
    
    

    但是,同样,这可能不是实现此目标的最有效方法,因为它可能会导致重复数据。因此,您可能应该考虑从“GroupSerializer”访问它。将应用相同的逻辑。

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 2018-02-17
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2017-07-28
      • 2016-12-30
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多