Django ManyToManyField反向关系

时间:2014-12-21 00:30:55

标签: django django-models

我想在我的桌子门票上做反向关系。

这是我的模特:

class Tickets(models.Model):
    ticket_title = models.CharField(max_length=100)
    ticket_content = models.TextField()

class User_Detail(models.Model):
    user = models.OneToOneField(User)
    tickets = models.ManyToManyField(Tickets, blank=True, null=True)

我创建了这样的票:

  

ticket = Tickets.objects.create(ticket_title =“test”,ticket_content =“test content”)

     

request.user.user_detail.tickets.add(票)

我要解决的问题是获取发票的人的用户名,(无request.user)

所以我试着这样:

  

ticket = Tickets.objects.get(pk = 1)

     

ticket.user_detail_set.user.username

但我得到

AttributeError:'ManyRelatedManager'对象没有属性'user'

感谢您的收看,希望您能理解。

1 个答案:

答案 0 :(得分:2)

由于您设置了多对多关系,因此Ticket可能包含许多User_Detail个对象。因此,Ticket.user_detail_set经理,而不是单个对象。您可以获得与Ticket相关联的第一个用户:

ticket.user_detail_set.first().user.username

但听起来你实际上想要TicketUser_Detail之间的一对多关系,这意味着你实际上希望Ticket拥有外键关系。你的模型应该是这样的:

class User_Detail(models.Model):
    user = models.OneToOneField(User)

class Ticket(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=100)
    contents = models.TextField()

然后你可以这样做:

ticket = Ticket.objects.get(pk=1)
user = ticket.user

您甚至可以完全删除User_Detail模型,除非您在应用程序的其他地方使用它和/或它的字段多于此处显示的字段。