176 votes

Comment dois-je inclure liées aux champs de modèle à l'aide de Django Repos Cadre?

Disons que nous avons le modèle suivant:

class Classroom(models.Model):
    room_number = [....]

class Teacher(models.Model):
    name = [...]
    tenure = [...]
    classroom = models.ForeignKey(Classroom)

Disons qu'au lieu d'obtenir un résultat de ce genre, par la ManyRelatedPrimaryKeyField fonction:

{
    "room_number": "42", 
    "teachers": [
        27, 
        24, 
        7
    ]
},

l'avoir de retour de quelque chose qui inclut la totalité du modèle associé à la représentation comme:

{
    "room_number": "42", 
    "teachers": [
        {
           'id':'27,
           'name':'John',
           'tenure':True
        }, 
        {
           'id':'24,
           'name':'Sally',
           'tenure':False
        }, 
    ]
},

Est-ce possible? Si oui, comment? Et est-ce une mauvaise idée?

273voto

Tom Christie Points 8729

La façon la plus simple est d'utiliser l'argument de la profondeur

class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom
        depth = 1

Cependant, qui comprend uniquement des relations pour l'avenir des relations, ce qui dans ce cas n'est pas tout à fait ce que vous avez besoin, car les professeurs de champ est la relation inverse.

Si vous avez des besoins plus complexes (par exemple. inclure inverse relations, nest certains domaines, mais pas d'autres, ou nid uniquement un sous-ensemble de champs), vous pouvez nid sérialiseurs, par exemple...

class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = ('id', 'name', 'tenure')

class ClassroomSerializer(serializers.ModelSerializer):
    teachers = TeacherSerializer(source='teacher_set')

    class Meta:
        model = Classroom

Notez que nous utilisons l'argument source sur le sérialiseur champ pour spécifier l'attribut à utiliser comme source du champ. Nous avons pu déposer l' source argument, au lieu de s'assurer l' teachers attribut existe à l'aide de la related_name option sur votre Teacher modèle, c'est à dire. classroom = models.ForeignKey(Classroom, related_name='teachers')

Une chose à garder à l'esprit est que imbriquée sérialiseurs ne prend actuellement pas en charge les opérations d'écriture. Pour l'écriture des représentations, vous devez utiliser régulièrement à plat des représentations, tels que pk ou de liens hypertexte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X