Вывести количество из двух моделей в одном представлении в Django - PullRequest
0 голосов
/ 02 июля 2018
class Album(models.Model):
    title = models.CharField(max_length=100, blank=True, default='')
    price = models.FloatField()
    upload_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('upload_time',)

 class Status(models.Model):
    user_id = models.IntegerField()
    album_id = models.IntegerField()
    favorite = models.BooleanField(default=False)
    purchase = models.BooleanField(default=False)
    history = models.BooleanField(default=False)

    def __str__(self):
        return self.user_id

в ModelViewSet Я написал так:

class index(viewsets.ModelViewSet):
    serializer_class = AlbumSerializer
    queryset = Album.objects.all()

enter image description here

Как показано на рисунке выше, мне нужно вывести количество покупок каждого Album, например, Album 1 был куплен 4 раза, Album 3 был куплен 1 раз.

Но сейчас мое представление индекса генерирует поля только в модели данных Album.

Что я должен сделать, чтобы реализовать это, добавить номер покупки для каждого Album? Нужна ваша помощь ...

Ответы [ 2 ]

0 голосов
/ 02 июля 2018
  1. Соедините ваши Альбом и Пользовательские модели как многие со многими:

    class Status(models.Model):
        user = models.ForeignKey('userapp.User', on_delete=models.CASCADE)
        album = models.ForeignKey('albumapp.Album', on_delete=models.CASCADE)
        favorite = models.BooleanField(default=False)
        purchase = models.BooleanField(default=False)
        history = models.BooleanField(default=False)
    

    Не забудьте применить миграцию.

  2. Сделать запрос с аннотацией:

    queryset = Album.objects.all().annotate(
        purchase_count=Count('status', filter=Q(status__purchase=True)),
        favorite_count=Count('status', filter=Q(status__favorite=True)),
        history_count=Count('status', filter=Q(status__history=True)),
    )
    
  3. В атрибутах purchase_count, favorite_count и history_count у вас будут соответствующие значения.

0 голосов
/ 02 июля 2018

Вы можете добавить что-то вроде этого в ваш класс сериализатора, чтобы посчитать это:

class AlbumSerializer(serializers.ModelSerializer):
    purchase_count =  serializers.SerializerMethodField(read_only=True)


    def get_purchase_count(self, obj):
        return Status.objects.filter(album_id=obj.id, purchase=True).count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...