I'm currently building a helpdesk ticketing system as a school project. I am using the built in django auth system, and I'd like to refer to user IDs from the auth sytem. For example, a ticket will be assigned to a certain helpdesk employee. A part of my model:

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

Users are in the group user, helpdesk employees are in the group helpdeskemployee of the django auth system.

I already found this and this

So I tried this:

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)

But that gives the folowing error while running 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'.
有帮助吗?

解决方案

Firstly, you probably don't want to use a OneToOneField. That would imply that a user can only ever have one single ticket. A ForeignKey relationship would be better.

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)

The reason you are getting an error is that you have two relationships to the same model from your Ticket. This means if you have a User object and you are trying to reverse it, it's not clear via which relationship you want to use:

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

To fix it, add a related_name attribute to each field

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")

Now you can get both reverse relationship separately:

 user.tickets_submitter.all()
 user.tickets_assignedto.all()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top