Django models 自引用模型的CreateView最佳实践

Django models 自引用模型的CreateView最佳实践,django-models,django-rest-framework,django-views,Django Models,Django Rest Framework,Django Views,我正在寻找关于如何在两个模型相互引用的系统中进行创建的最佳实践。我想创建以下用户故事 作为一个新用户,我可以创建一个用户帐户,然后立即创建我的组织。我将被设置为主要用户,并拥有从组织中添加或删除其他常规用户的权限。我添加的任何普通用户都无法添加用户 我有这些模型: class User(AbstractUser, BaseModel): org = models.ForeignKey( "Org", on_delete=models.SET_NULL,

我正在寻找关于如何在两个模型相互引用的系统中进行创建的最佳实践。我想创建以下用户故事

作为一个新用户,我可以创建一个用户帐户,然后立即创建我的组织。我将被设置为主要用户,并拥有从组织中添加或删除其他常规用户的权限。我添加的任何普通用户都无法添加用户

我有这些模型:

class User(AbstractUser, BaseModel):
    org = models.ForeignKey(
        "Org", on_delete=models.SET_NULL, blank=True, null=True, related_name="user"
    )

    @property
    def is_primary(self):
        if self.org.primary_user.uuid == self.uuid:
            return True
        return False

class Org(BaseModel):
    primary_user = models.ForeignKey(
        User, on_delete=models.CASCADE, blank=True, null=True, related_name="user"
    )
我在考虑两种方法:

方式1-创建保存后信号,自动为用户创建组织,并将主用户设置为用户。(这段代码并不完全有效,但你已经明白了)

方式2-具有启动用户(例如,新用户和新组织)和常规创建用户(需要传递组织)的视图

class InitUserView(ListCreateAPIView):
    """
    Initiate User and new Org.
    """
    permission_classes = [AllowAny]
    queryset = User.objects.all()
    serializer_class = UserSerializer # where the Org is writable


class UserCreateWithOrgView(LoginRequiredMixin, ListCreateAPIView):
    """
    Create users on an existing Org.
    """
    permission_classes = [(IsInResourceOrg & IsPrimaryUser) | IsStaffUser]
    queryset = User.objects.all()
    serializer_class = UserSerializer
对于发起用户和组织操作,最佳实践是什么:

  • 一个CreateUserView,它只生成一个用户,然后触发如上所述的post save信号。然后,前端强制用户下一步通过OrgUpdateView获取关于该组织的其他数据
  • 一个InitUserView,在一次调用中需要用户和组织数据。如果这是正确的,那么是否需要第二个用户序列化程序,其中Org不是只读的?如何在一个视图中发布两个模型

  • 如果你有其他建议,比如重新定义模型,我也愿意接受

    您可以根据业务逻辑选择其中一种方法。如果字段可以为空,那么实际上不需要为用户自动创建组织,而应该允许用户自己填充。如果要在一个视图中创建用户和组织,请签出文档中的DRF可写嵌套序列化程序
    class InitUserView(ListCreateAPIView):
        """
        Initiate User and new Org.
        """
        permission_classes = [AllowAny]
        queryset = User.objects.all()
        serializer_class = UserSerializer # where the Org is writable
    
    
    class UserCreateWithOrgView(LoginRequiredMixin, ListCreateAPIView):
        """
        Create users on an existing Org.
        """
        permission_classes = [(IsInResourceOrg & IsPrimaryUser) | IsStaffUser]
        queryset = User.objects.all()
        serializer_class = UserSerializer