【问题标题】:Django unique_together across models跨模型的 Django unique_together
【发布时间】:2016-01-12 16:16:17
【问题描述】:

所以,我有这两个模型:

class User(AbstractBaseUser):
"""
Custom user class
"""
    email = models.EmailField(verbose_name = 'email address', unique = True, db_index = True)
    joined = models.DateTimeField(auto_now_add = True)
    is_active = models.BooleanField(default = True)
    is_admin = models.BooleanField(default = False)
    user_type = models.CharField(max_length = 30)
    group = models.ManyToManyField(Group, related_name = 'users')
    permission = models.ManyToManyField(Permission, related_name = 'users')

    USERNAME_FIELD = 'email'  # Mapping between our model's email field to Django's User model's username

class Subscription(models.Model):

    project_name = models.CharField(max_length = 40) # A subscription can only be for one project (one to one), e.g. you cannot buy a subscription for two projects.  You have to buy two different subscriptions
    user = models.ManyToManyField(User, related_name = 'subscriptions', blank = True) # One user can have many different subscriptions (e.g. for different projects), and one subscription is good for many users
    date = models.DateTimeField(auto_now_add = True) # Keeping track of when a subscription is entered
    mop = models.CharField(max_length = 20, choices = PAYMENT_CHOICES)
    payment_term = models.CharField(max_length = 30, choices = PAYMENT_TERMS)
    package = models.CharField(max_length = 50, choices = PACKAGES)

因此,用户和订阅之间存在多对多关系,例如一个用户可以有多个订阅,一个订阅对多个用户都有好处。

当用户注册时,它应该允许用户使用相同的电子邮件地址注册不同的项目。但是,它不会这样做,因为设置了 unique=True。我尝试删除 unique=True,但显然它抱怨 Django 需要 USERNAME = 'email' 的唯一字段。

理想情况下,我希望在电子邮件(用户模型)和项目(订阅模型)上都具有 unique=True,例如虽然一个用户不能多次注册一个项目,但一个用户可以拥有多个项目。我怎么做?似乎 project_name 字段属于订阅模型而不属于用户模型,因为如果它在用户模型中,由于多对多关系,这意味着订阅可以有许多不正确的项目(即订阅总是针对一个项目)。

一方面,我希望登录页面允许用户仅使用他们的电子邮件地址登录(因此我需要在电子邮件上使用 unique=True 才能登录)。另一方面,我希望注册允许在不同项目中注册相同的电子邮件,而不是抱怨该电子邮件已经存在(因此,我不需要 unique=True 在电子邮件上进行注册)。

有什么想法吗?

【问题讨论】:

  • 如果您也将 unique=True 放在 project_name 上,它应该可以工作。如果它不起作用,则错误可能在添加订阅的代码中。您可以将该代码添加到您的问题中吗?
  • @FrederikVds,我确实尝试了您的解决方案,它给了我并且表单重新加载,抱怨“使用此电子邮件地址的用户已经存在”。显然,当电子邮件仍然是唯一的时,您不能再次注册相同的电子邮件地址。为 project_name 添加 unique = True 只会强制 project_name 的唯一性,但不会接受重复的电子邮件。
  • 是的,但是生成此错误的表单代码是什么?您的模型看起来不错,但您不应尝试在表单中创建新用户,而应尝试查找现有用户并仅添加新订阅。

标签: django django-models django-registration django-users


【解决方案1】:

嗯,我解决它的方法是捕获异常。当它在调用 is_valid() 后抛出用户已经存在的异常时,我确保我只是注册了项目。

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2010-12-27
    • 2012-01-05
    • 2011-11-23
    • 2017-12-08
    • 2023-01-07
    相关资源
    最近更新 更多