我想建立以下应用模型:一个老板有不同的商店,每个商店都有一些顾客和一些雇员为该商店工作;同一个雇员可以在属于同一个老板的不同商店工作,也可以在属于不同老板的商店工作。只有所有者和员工才能登录到系统,客户不能登录。我创建了以下模型并将用户添加到不同的组(使用Django Auth system和允许自定义用户模型的1.6.2版本),但我关注应用程序正在执行的查询数量,我对建模不太确定。最大的困难是,如果店主有不同的商店,当店主登录到他需要选择与哪个商店一起工作的系统时,也能够添加相关的员工和客户(只有店主可以添加员工和客户)。
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.CharField(max_length=254,
unique=True)
firstname = models.CharField(max_length=64)
lastname = models.CharField(max_length=64)
...
objects = CustomUserManager()
USERNAME_FIELD = 'email'
...
class Shop(models.Model):
name = models.CharField(...)
city = ...
address = ...
class Customer(models.Model):
shop = models.ForeignKey(Shop)
...
class Employee(CustomUser):
shops = models.ManyToManyField(Shop)
...
class Owner(CustomUser):
shops = models.ManyToManyField(Shop)
...现在,当员工或所有者用电子邮件登录到系统时,应用程序需要显示一个带有可用商店的选择框,用户的选择需要传递到应用程序的每个视图:我如何做到这一点?我想不可能是一个帖子,因为我会在应用程序中有其他的表单,应该是一个GET请求,但是我需要验证的每一个请求都是商店的所有者或雇员的(越来越多的查询)。我已经开发了应用程序的很大一部分(例如,订单),但我要回到开始阶段;我不知道我所做的所有模型都应该与商店或所有者相关。如有任何建议,敬请见谅。谢谢。
发布于 2014-03-09 21:08:10
我现在的例子可能是不完美的,但我认为它会澄清您应该如何使用Django来实现这个目标。(同时阅读以下内容:https://docs.djangoproject.com/en/1.6/topics/db/managers/)
class ShopsUser(AbstractBaseUser, PermissionsMixin):
email = models.CharField(max_length=254,
unique=True)
firstname = models.CharField(max_length=64)
lastname = models.CharField(max_length=64)
...
objects = CustomUserManager()
USERNAME_FIELD = 'email'
...
priviledge_flag = models.CharField(choices=(('o', 'owner'), ('e', 'employe'), ('c', 'customer'))
class Customer(models.Model):
shop = models.ForeignKey(Shop)
class Shop(models.Model):
customers = models.ForeignKey(Customer, related_name='shops')
admins = models.ManyToMany(ShopsUser, related_name='managed_shops')现在,您可以使用视图中的登录用户(使用会话)查找所有数据:
class SomeView(View):
def get(self, *args, **kwargs):
admin = self.request.user
all_singed_in_admin_shops = admin.managed_shops.all()
first_shop = all_singed_in_admin_shops[0]
first_shop_customers = first_shop.customers.all()https://stackoverflow.com/questions/22286908
复制相似问题