我正在寻找有关如何在具有两个相互引用的模型的系统中进行创建的最佳实践。我要创建以下用户故事。
作为新用户,我可以创建一个用户帐户,然后立即创建我的组织。我将被设置为主用户,并有权从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
对于发起用户和组织操作,最佳做法是:
如果您还有其他建议(例如重新定义模型),我也欢迎您!