Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保存期间视图集中模型的自动增量字段_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

Python 保存期间视图集中模型的自动增量字段

Python 保存期间视图集中模型的自动增量字段,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,插曲模型有插曲编号字段,在创建新插曲时,该字段必须自动递增。每一个故事都会有以一开始的插曲编号字段的插曲。怎么做?现在我必须手动输入插曲号码。故事id来自url class Story(models.Model): title = models.CharField(max_length=255) description = models.TextField(max_length=255) cover = models.ImageField(upload_to=upload

插曲模型有插曲编号字段,在创建新插曲时,该字段必须自动递增。每一个故事都会有以一开始的插曲编号字段的插曲。怎么做?现在我必须手动输入插曲号码。故事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)
案例场景 当基于参考的
Story
model
epiod
模型中有新条目时,应自动填充

可能的解决办法 我们将覆盖
Episod
model的默认保存方法,并检查这是否是新实例的条目,我们将从这里设置其值

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)

关键是,如果db中有30集,并且我正在创建新的故事,并且想要创建故事的一集,那么pk将是31,但是插曲编号必须是1。在您的情况下,它将只存储31个。您也可以发布您的
故事
模型。以及如何管理故事和插曲模型之间的关系。发布后,只有外键和插曲序列化程序包含故事的故事序列化程序field@DanabekDuisekov如果不覆盖
模型
保存方法,恐怕这是不可能的。您的方法也是解决方案之一。但最好在
方法save
中这样做,因为它将作为单一的操作源。这是非常重要的。如果你愿意,我可以更新我的答案。当然,我会试试