web-dev-qa-db-fra.com

Comment rejoindre deux modèles dans Django-rest-framework

Disons que j'ai deux modèles:

level:

id
file_number
status


level_process:

process_ptr_id
level_id

Je souhaite combiner les deux tableaux ci-dessus pour l'afficher dans une API à l'aide de Django-rest-framework .. Je recherche l'exemple sur Internet et je ne le trouve pas ... en passant, j'utilise python 2.7 , Django 1.10.5 and djangorestframework 3.6.2

serializer.py

class LevelSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    class Meta:
        model = Level
        fields = ('__all__')

class LevelProcessSerializer(serializers.ModelSerializer):
    level = LevelSerializer(read_only=True)

    class Meta:
        model = LevelProcess
        fields = ('__all__')

views.py

class ViewLevelProcessViewSet(viewsets.ModelViewSet):
    processes = LevelProcess.objects.all()
    serializer_class = LevelProcessSerializer(processes, many=True)
6
MunirohMansoor

Essayez ce qui suit. Créez un sérialiseur pour votre modèle Level:

class LevelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Level

Ensuite, dans LevelProcessSerializer, incluez LevelSerializer comme ceci:

class LevelProcessSerializer(serializers.ModelSerializer):
    level = LevelSerializer(read_only=True)

    class Meta:
        model = LevelProcess

Utilisation dans votre ModelViewset:

class ViewLevelProcessViewSet(viewsets.ModelViewSet):
    queryset = LevelProcess.objects.all() 
    serializer_class = LevelProcessSerializer

De cette façon, votre JSON ressemblera à quelque chose comme ça:

{
   "id": 1,
   "level": {
      "id": 3,
      "status": "red"
   }
}

J'espère que cela t'aides!

11

N'essayez pas de "joindre" des tables. Ce n'est pas SQL.

Je suppose que votre modèle ressemble à suit,

class Level(models.Model):
    .......

class LevelProcess(models.Model):
    level = models.ForeignKey(Level)

Maintenant, marchons pour la requête,

l = Level.objects.filter(id=level_id).first()
lp = l.level_process_set.all()

C'est ce que nous faisons dans Django ORM.

0
Ashraful Islam