Поле автоинкремента модели в наборе во время сохранения - PullRequest
0 голосов
/ 29 сентября 2019

Модель эпизода имеет поле episode_number, которое должно автоматически увеличиваться при создании нового эпизода.Каждая история будет иметь эпизоды с полем episode_number, начинающимся с единицы.Как это сделать?Теперь я должен вручную ввести episode_number.story_id происходит от URL

class Story(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(max_length=255)
    cover = models.ImageField(upload_to=upload_location)
    genre = models.ManyToManyField(Genre)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

class Episode(models.Model):
    title = models.CharField(max_length=255)
    cover = models.ImageField(upload_to=upload_location)
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    episode_number = models.IntegerField(null=True)

class EpisodeView(viewsets.ModelViewSet):
    serializer_class = EpisodeSerializer
    permission_classes = [BasicAuthorizationPermissions]

    def get_queryset(self):
        story_id = self.kwargs['story_id']
        return Episode.objects.filter(story=story_id)

    def perform_create(self, serializer):
        try:
            story = Story.objects.get(pk=self.kwargs['story_id'])
        except Story.DoesNotExist:
            raise NotFound

        if self.request.user != story.author:
            raise PermissionDenied

        return serializer.save(story=story)

1 Ответ

1 голос
/ 29 сентября 2019

Сценарий случая

При наличии новой записи в Episod модель на основе ссылки Story модель episode_number должна автоматически заполняться.

Возможное решение

Мы собираемся перезаписать Episod метод сохранения модели по умолчанию и проверим, если это запись для нового экземпляра, мы установим его значение отсюда.

class Episode(models.Model):
    title = models.CharField(max_length=255)
    cover = models.ImageField(upload_to=upload_location)
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    episode_number = models.IntegerField(null=True)

    def save(self, *args, **kwargs):
        if not self.pk: # new instance
            self.episode_number = Episode.objects.filter(story=self.story).count() + 1

        return super().save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...