Python 在django中创建嵌套类并运行helper方法
我有以下用户模型Python 在django中创建嵌套类并运行helper方法,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有以下用户模型 class User(AbstractBaseUser, PermissionsMixin, Base): username = models.CharField(max_length=255, null=False) email = models.CharField(max_length=255, null=False, unique=True) user_type = models.CharField(max_length=255, null=Fal
class User(AbstractBaseUser, PermissionsMixin, Base):
username = models.CharField(max_length=255, null=False)
email = models.CharField(max_length=255, null=False, unique=True)
user_type = models.CharField(max_length=255, null=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
这是我的会议模式
class Meeting(Base):
meeting_code = models.CharField(max_length=255)
owner = models.ForeignKey(User, related_name='meetings', on_delete=models.CASCADE, null=True, blank=True)
members = models.ManyToManyField(User, related_name='meeting_set', null=True, blank=True)
start_time = models.DateTimeField(auto_now_add=True)
end_time = models.DateTimeField(null=True)
创建会议时,我想运行这个helper函数来生成会议代码
def generate_meetingid():
return ''.join(random.choices(string.ascii_uppercase, k=16))
这是我的会议序列化程序
class MeetingSerializer(serializers.ModelSerializer):
owner = UserSerializer(required=True)
class Meta:
model = Meeting
fields = ['id', 'meeting_code', 'owner', 'members', 'start_time', 'end_time', ]
我的问题是如何编写会议视图集,将创建用户添加为所有者,并运行helper方法来创建会议代码。
本质上,我试图完成这个观点
class MeetingViewSet(viewsets.ModelViewSet):
queryset = Meeting.objects.all()
serializer_class = MeetingSerializer
def perform_create(self, serializer):
serializer.save()
最简单的方法是重写
save
方法,而我通常更喜欢使用pre_save
信号。该逻辑类似于生成唯一的slug
。例如,在保存对象之前,会自动调用helper函数。在序列化程序中,您可以简单地将meeting\u code
标记为read\u only
,以便在反序列化期间创建或更新实例时不使用meeting\u code
# override save method
class Meeting(models.Model):
...
def save(self, *args, **kwargs):
# avoid meeting_code IntegrityError
# self._state.adding == True means item was not added in the database yet
if self._state.adding and not self.meeting_code:
self.meeting_code = generate_meetingid()
while Meeting.objects.filter(meeting_code=self.meeting_code).exists():
self.meeting_code = generate_meetingid()
super().save(*args, **kwargs)
# pre_save signal
@receiver(pre_save, sender=Meeting)
def generate_meeting_code(sender, **kwargs):
if kwargs.get('created', False):
# on meeting create
meeting=kwargs.get('instance')
meeting.meeting_code = generate_meetingid()
while Meeting.objects.filter(meeting_code=self.meeting_code).exists():
meeting.meeting_code = generate_meetingid()
序列化程序
意见
谢谢虽然这样做很好,但我想知道while循环中的调用有什么作用?@root它确保了meeting_代码的唯一性,并且不会与以前保存的代码冲突。
class MeetingSerializer(serializers.ModelSerializer):
owner = UserSerializer(required=True)
class Meta:
model = Meeting
fields = ['id', 'meeting_code', 'owner', 'members', 'start_time', 'end_time', ]
read_only_fields = ['meeting_code']
class MeetingViewSet(viewsets.ModelViewSet):
queryset = Meeting.objects.all()
serializer_class = MeetingSerializer
def perform_create(self, serializer):
# pass owner to the serializer
serializer.save(owner=self.request.user)