【问题标题】:Django models: user IDDjango 模型:用户 ID
【发布时间】:2014-03-04 02:36:47
【问题描述】:

我目前正在构建一个帮助台票务系统作为学校项目。我正在使用内置的 django 身份验证系统,我想参考身份验证系统中的用户 ID。例如,工单将分配给某个帮助台员工。我的模型的一部分:

class Ticket(models.Model):
    category = models.ManyToManyField(Category)
    title = models.CharField(max_length=30)
    submitted = models.DateTimeField(editable=False)
    submitter = #reference to user
    assignedTo = #reference to helpdesk employee

用户在组user,服务台员工在组helpdeskemployee django auth 系统。

我已经找到thisthis

所以我尝试了这个:

class Ticket(models.Model):
    category = models.ManyToManyField(Category)
    title = models.CharField(max_length=30)
    submitted = models.DateTimeField(editable=False)
    submitter = models.OneToOneField(User)
    assignedTo = user = models.OneToOneField(User)

但这在运行python manage.py syncdb 时会出现以下错误:

CommandError: One or more models did not validate:
deskman.ticket: Accessor for field 'submitter' clashes with related field 'User.ticket'. Add a related_name argument to the definition for 'submitter'.
deskman.ticket: Reverse query name for field 'submitter' clashes with related field 'User.ticket'. Add a related_name argument to the definition for 'submitter'.
deskman.ticket: Accessor for field 'assignedTo' clashes with related field 'User.ticket'. Add a related_name argument to the definition for 'assignedTo'.
deskman.ticket: Reverse query name for field 'assignedTo' clashes with related field 'User.ticket'. Add a related_name argument to the definition for 'assignedTo'.
deskman.ticket: Accessor for field 'assignedTo' clashes with related field 'User.ticket'. Add a related_name argument to the definition for 'assignedTo'.
deskman.ticket: Reverse query name for field 'assignedTo' clashes with related field 'User.ticket'. Add a related_name argument to the definition for 'assignedTo'.

【问题讨论】:

    标签: python django django-models django-authentication


    【解决方案1】:

    首先,您可能不想使用OneToOneField。这意味着用户只能拥有一张票。 ForeignKey 关系会更好。

    class Ticket(models.Model):
        category = models.ManyToManyField(Category)
        title = models.CharField(max_length=30)
        submitted = models.DateTimeField(editable=False)
        submitter = models.ForeignKey(User)
        assignedTo = models.ForeignKey(User)
    

    您收到错误的原因是您与 Ticket 的同一模型有两个关系。这意味着,如果您有一个 User 对象并且您正在尝试反转它,则不清楚您要使用哪种关系:

     user.ticket_set.all() 
     # Do you want `submitter` tickets, or `assignedTo` tickets? It's not clear
    

    要修复它,请为每个字段添加 related_name 属性

    class Ticket(models.Model):
        category = models.ManyToManyField(Category)
        title = models.CharField(max_length=30)
        submitted = models.DateTimeField(editable=False)
        submitter = models.ForeignKey(User, related_name="tickets_submitter")
        assignedTo = models.ForeignKey(User, related_name="tickets_assignedto")
    

    现在你可以分别得到两个反向关系:

     user.tickets_submitter.all()
     user.tickets_assignedto.all()
    

    【讨论】:

    • 你能解释一下assignedTo = user = ... 的工作原理吗?
    • 哎呀,错字了。现已修复
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2011-01-14
    • 1970-01-01
    • 2018-09-29
    • 2015-12-22
    • 2012-01-03
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多