Django ORM - Добавить данные из промежуточной таблицы - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующая структура данных «многие ко многим» в моем приложении 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')

не работает, к сожалению ...

кто-нибудь может поддержать?

EDIT:

сериализаторы:

class UserSerializer(serializers.ModelSerializer):

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

class MembershipSerializer(serializers.ModelSerializer):

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

1 Ответ

0 голосов
/ 07 ноября 2018

Я думаю, что решение вашей проблемы связано с тем, как вы сериализуете объекты с самим набором запросов.

Используете ли вы 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')
...