как отобразить мою модель M2M в Django Rest Framework - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь отобразить «вложенную» модель в своем ответе API, и у меня возникают проблемы при формировании данных.

У меня есть модель, из которой вызывается API:

что-то вроде

class Rules(Model):
    conditions = models.ManyToManyField(RulesPoliciesConditions)
    ...
    ...

class RulesPoliciesConditions(Model):
    rules = models.ForeignKey(Rules, ...) 
    policies = models.ForeignKey(Policy, ...)

Правила и политики являются их собственными моделями с несколькими текстовыми полями (имя, псевдоним, отметка времени и т. Д.)

Моя проблема заключается в том, что при использовании модели правил вызывается поле с именем conditions, отображаются только правила и политики PK.Я хочу получить доступ к другим атрибутам, таким как имя, временная метка, псевдоним и т. Д.

Я пытался заставить свои поля (в моем сериализаторе) пытаться вызывать так же, как "condition__rules__name", но это недопустимо, я также пробовал "условия".rules.name ", что также недопустимо.Может быть, я использую неправильное поле в моем сериализаторе, я пытаюсь conditions = serializers.SlugRelatedField(many=True, queryset=q, slug_field="id")

Я собираюсь отобразить что-то вроде:

conditions: [
    {
     rules: {id: rulesId, name: rulesName, ...},
     policies: {id: policiesId, name: policiesName, ...}
    }, ...
]

или даже четное: условия: [{rules: rulesName ,icies :iciesName}, ...]

, поскольку сейчас он просто возвращает rulesId и policyId и не «знает» о других полях

РЕДАКТИРОВАТЬ:Я нашел соответствующий вопрос по SO, но не смог получить соответствующий ответ Django REST Framework: Добавить поле из связанного объекта в ModelSerializer

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Этого можно добиться с помощью вложенных сериализаторов .Уровень вложенности может контролироваться / настраиваться различными способами

class RulesPoliciesConditionsSerializer(serializers.ModelSerializer):
    class Meta:
        fields = '__all__'
        model = RulesPoliciesConditions
        depth = 1


class RulesSerializer(serializers.ModelSerializer):
    conditions = RulesPoliciesConditionsSerializer(many=True)

    class Meta:
        fields = '__all__'
        model = Rules

Передать ваш Rules набор запросов в RulesSerializer сериализатор для получения желаемого выхода

Пример


rules_qs = Rules.objects.all()
rules_serializer = RulesSerializer(rules_qs, many=True)
data = rules_serializer.data


Ссылки
1. сериализатор depth
2. Вложенный сериализатор

0 голосов
/ 21 сентября 2018

Вы можете использовать вложенные сериализаторы для этой цели.

class RuleSerializer(serializers.ModelSerializer):
    ...
    class Meta:
         model = Rules(rulesId, rulesName)
         fields = ('id', 'email', 'country')

class RulesPoliciesConditionsSerializer(serializers.ModelSerializer):
     rules = RuleSerializer()
     policies = PolicySerializer()
     ...
...