Python 保存期间视图集中模型的自动增量字段
插曲模型有插曲编号字段,在创建新插曲时,该字段必须自动递增。每一个故事都会有以一开始的插曲编号字段的插曲。怎么做?现在我必须手动输入插曲号码。故事id来自urlPython 保存期间视图集中模型的自动增量字段,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
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
modelepiod
模型中有新条目时,应自动填充
可能的解决办法
我们将覆盖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
中这样做,因为它将作为单一的操作源。这是非常重要的。如果你愿意,我可以更新我的答案。当然,我会试试