2014-02-06 6 views
2

В настоящее время я строил систему продажи билетов в качестве школьного проекта. Я использую встроенную систему django auth, и я хотел бы ссылаться на идентификаторы пользователей из auth sytem. Например, билет будет назначен определенному сотруднику службы поддержки. Часть моей модели:Модели 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 системы Джанго AUTH.

Я уже нашел this и 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) 

Но это дает ошибку folowing во время работы 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'. 

ответ

5

Во-первых, вы, вероятно, не хотите использовать OneToOneField. Это означает, что пользователь может иметь только один билет. A 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() 
+0

вы могли бы объяснить, как работает 'assignedTo = пользователь = ...'? – akaRem

+1

oops, typo. Исправлено –

Смежные вопросы