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)