Django - Получение объекта из объекта

Просмотров:

class Book_PrommotionViewSet(viewsets.ViewSet):
def list(self, request):
    queryset = Prommotion.objects.filter(active=True)
    serializer = PrommotionSerializer(queryset, many=True)
    return Response(serializer.data, HTTP_200_OK)

Модель:

class Prommotion(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
precent = models.DecimalField(decimal_places=2, max_digits=255, null=True, blank=True)
active = models.BooleanField(default=False)
date_from = models.DateField()
date_to = models.DateField()
book = models.ForeignKey(Book, on_delete=models.SET_NULL, null=True, blank=True)
country = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
    verbose_name = 'Prommotion'
    verbose_name_plural = 'Prommotions'

Модель книги:

class Book(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=255, null=True, blank=True)
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True, blank=True)
price = models.DecimalField(decimal_places=2, max_digits=255)
published = models.DateField()
edition = models.CharField(max_length=255)
isbn_code = models.CharField(max_length=255)
pages = models.IntegerField(blank=True, null=True, default=0)
description = models.TextField(null=True, blank=True)
cover = models.CharField(max_length=30, choices=Cover.choices(), default=None, null=True, blank=True)
genre = models.CharField(max_length=30, choices=Genre.choices(), default=None, null=True, blank=True)
language = models.CharField(max_length=30, choices=Language.choices(), default=None, null=True, blank=True)
format = models.CharField(max_length=30, choices=Format.choices(), default=None, null=True, blank=True)
publisher = models.CharField(max_length=30, choices=Publisher.choices(), default=None, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.title

class Meta:
    verbose_name = 'Book'
    verbose_name_plural = 'Books'

Так, я пытаюсь получить объект "Book" из prommotion. Book - это ForeignKey в "prommotion", и я отфильтровал все активные промоакции. И мне нужно получить объект "Book" из Prommotion, если он активен, и вернуть его.

И я знаю, что "продвижение" пишется неправильно

Первый способ получить все книги, которые связаны с вашими активными акциями, - это извлечь идентификаторы книг из набора запросов и передать их в фильтр Book

active_promotions = Prommotion.objects.filter(active=True)
Book.objects.filter(id__in=active_promotions.values('book_id'))

Или просто отфильтруйте книги с активными акциями, используя синтаксис двойного подчеркивания для отслеживания отношений

Book.objects.filter(prommotion__active=True).distinct()
Вернуться на верх