自参考模型的CreateViews最佳做法

时间:2020-09-17 02:38:52

标签: django-models django-rest-framework django-views

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

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

我有以下模型:

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-创建一个保存后信号,该信号为User自动创建一个组织,并将primary_user设置为user。 (此代码无法正常工作,但您可以理解)

@receiver(post_save, sender=User)
def create_org_for_new_user(sender, instance, created, **kwargs):
    if created:
        if not User.org:
             org = Org.objects.create(primary_user=instance)
             User.objects.update(org=org)

方法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

对于发起用户和组织操作,最佳做法是:

  1. 一个CreateUserView,它仅使一个用户,然后如上所述触发一个后保存信号。然后,前端会强制用户通过OrgUpdateView进行下一步操作,以获取有关组织的其他数据。
  2. 一个InitUserView,它在一个调用中需要User和Org数据。如果这是正确的,那么是否需要另一个Org不是只读的用户序列化程序?以及如何在一个视图中发布两个模型?

如果您还有其他建议(例如重新定义模型),我也欢迎您!

0 个答案:

没有答案