【问题标题】:Django ORM - Add data from intermediate tableDjango ORM - 从中​​间表添加数据
【发布时间】:2019-04-10 19:55:30
【问题描述】:

我的 django rest 应用程序中有以下多对多数据结构:

class User(Model):

    name = models.CharField(max_length=64)
    memberships = models.ManyToManyField('Membership', through='UserMembership', related_name='users')

    def __str__(self):
        return "{}".format(self.name)

class Membership(Model):

    name = models.CharField(max_length=64)

    def __str__(self):
        return "{}".format(self.name)

class UserMembership(Model):

    user = models.ForeignKey('User', on_delete=models.CASCADE)
    membership = models.ForeignKey('Membership', on_delete=models.CASCADE)
    reason = models.CharField(max_length=64)

当我想列出我得到的所有用户时:

{
    id: 1,
    name: "name-a",
    memberships: [
        {
            id: 1,
            name: "member-a"
        }, ...
    ]
}

但我实际上想包括“原因”字段

{
    id: 1,
    name: "name-a",
    memberships: [
        {
            id: 1,
            name: "member-a",
            reason: "somereason"
        }, ...
    ]
}

但是如何修改查询集呢?

User.objects.all().values('members__usermember')

不幸的是没有工作......

有人支持吗?

编辑:

序列化器:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'name', 'memberships')

class MembershipSerializer(serializers.ModelSerializer):

    class Meta:
        model = Membership
        fields = ('id', 'name')

【问题讨论】:

    标签: django database join orm django-queryset


    【解决方案1】:

    我认为您的问题的解决方案更多地取决于您如何使用查询集本身序列化对象。

    您是否使用 django-rest-framework,如果是,请将序列化程序添加到响应中。否则,请注释并添加代码以查看您如何序列化模型。

    编辑以添加可能的序列化程序:

    尝试使用类似于此剪断的东西

    class UserMembershipSerializer(serializer.ModelSerializer):
        name = serializers.ReadOnlyField(source='membership.name')
    
        class Meta:
            model = UserMembership
            fields = ('reason', 'name')
    
    
    class UserSerializer(serializer.ModelSerializer):
        memberships = UserMembershipSerializer(source='usermembership_set', many=True)
    
        class Meta:
            model = User
            fields = ('id', 'name', 'memberships')
    

    【讨论】:

    • 嘿,我添加了请求的序列化程序...你可以参考一下吗?
    • 当然,我对序列化程序添加了一些可能的修改
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2018-12-22
    • 1970-01-01
    • 2018-09-25
    • 2020-06-14
    • 2021-04-21
    • 2016-10-07
    • 2023-03-16
    相关资源
    最近更新 更多