J'ai les 2 modèles Django suivants, Lessons et UserLessons.

Lessons serait créé par un administrateur et UserLessons est essentiellement lorsqu'un utilisateur est en cours avec le Lesson ou completed le Lesson, lié par une clé étrangère . UserLesson ne contient pas nécessairement une entrée Lesson, jusqu'à ce que l'utilisateur commence réellement avec cette entrée spécifique.

Comme je construis une API (avec DRF), je dois lister la liste complète de toutes les leçons - c'est facile. LessonList = Lesson.objects.all().values('id', 'title')

Cela revient

[
    {
        "id": 1,
        "title": "Lesson 1"
    },
    {
        "id": 2,
        "title": "Lesson 2"
    },
    {
        "id": 3,
        "title": "Lesson 3"
    }
]

Cependant, je dois pouvoir le fusionner avec UserLesson (par exemple UserLessonList = UserLesson.objects.filter(user=request.user).values('id', 'lesson__id', 'completed') qui renvoie actuellement

[
    {
        "id": 2,
        "lesson__id": 1,
        "completed": true
    },
    {
        "id": 3,
        "lesson__id": 2,
        "completed": true
    }
]

Idéalement, il devrait renvoyer toutes les leçons de la base de données et les valeurs terminées, par défaut completed: false si cette leçon spécifique n'existe pas dans la base de données.

Aucune suggestion?

Éditer:

Vues

class LessonList(APIView):

    permission_classes = (IsAuthenticated,)

    def get(self, request):

        LessonList = Lesson.objects.all().values('id', 'title')
        UserLessonList = UserLesson.objects.filter(user=request.user).values('id', 'lesson__id', 'completed')





        return Response(LessonList)

Des modèles

class Lesson(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=250, verbose_name=u'Title')
    slug = models.SlugField(null=True, blank=True, help_text='eg, lesson-1-whats-up')
    published = models.BooleanField(default=False)

    def __str__(self):
        return(self.title)

class UserLesson(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, null=True)
    completed = models.BooleanField(default=False)

    def __str__(self):
        text = str(self.lesson.title)
        return(text)
0
Ronald Langeveld 24 janv. 2020 à 14:53

1 réponse

Meilleure réponse

Vous devez utiliser ModelViewSet et des sérialiseurs. Exactement ModelSerializer. Quelque chose comme ça:

class LessonSerializer(serializers.ModelSerializer):
    completed = serializers.SerializerMethodField()
    class Meta:
        model = Lesson
        fields = ['id', 'title', 'completed']

   def get_completed(self, obj):
        user = self.context.get('request').user
        return UserLesson.objects.filter(user=user, lesson=obj, completed=True).exists()

class LessonViewSet(viewsets.ModelViewSet):
    queryset = Lesson.objects.filter(published=True)
    serializer_class = LessonSerializer
    permission_classes = [IsAuthenticated]

1
Andrey Leontyev 24 janv. 2020 à 13:23