我目前正在学习Django,但发现将ManyToMany
字段包围起来有点困难。我正在使用中间模型来管理我的关系。
我有三种模式; Ticket
,User
和TicketUserRelation
。
我希望能够查询票证模型,并检索其相应的用户对象和票证对象。我将如何去做?
在Laravel中,我会按照以下方式进行操作
Ticket::where('id', '1')->with('contributors')
但是我真的不知道如何在Django中做到这一点
模型:
class User(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Ticket(models.Model):
contributors = models.ManyToManyField(User, through=TicketUserRelation, related_name='tickets')
name = models.CharField(max_length=50)
created_at = models.DateField()
def __str__(self):
return self.name
class TicketUserRelation(models.Model):
id = models.AutoField(primary_key=True, db_column='relation_id')
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
编辑:我正在使用中间模型,以便以后可以轻松添加诸如加入日期之类的内容。
答案 0 :(得分:0)
使用Django ORM时不需要TicketUserRelation
模型。如果可以将一个票证分配给多个用户,则可以简单地在ForeignKey
模型中使用Ticket
,或者使用已经定义的ManyToManyField
。
class Ticket(models.Model):
# For one user, use ForeignKey
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='tickets')
# For multiple users, use ManyToManyField
contributors = models.ManyToManyField(User, related_name='tickets')
name = models.CharField(max_length=50)
created_at = models.DateField()
def __str__(self):
return self.name
您可以通过以下方式获取用户u
的所有票证:
u.tickets.all()
答案 1 :(得分:0)
使用prefetch_related
自己弄清楚。我在理解prefetch_related
的工作方式时遇到了麻烦。对于那些也感到困惑的人,根据我的理解,它的工作方式如下:
Ticket.objects.all().prefetch_related('contributors')
这将返回一个查询集,其内容与此类似
<QuerySet [<Ticket: Testing ticket one>, <Ticket: Testing ticket two>, <Ticket: Testing ticket three'>, <Ticket: Testing ticket four>]>
当您随后访问查询集中的元素时,可以在对象上调用.contributors
,如下所示:
# Get the queryset
tickets_with_contribs = Ticket.objects.all().prefetch_related('contributors')
# Print the contributors of the first ticket returned
print(tickets_with_contribs[0].contributors)
# Print the contributors of each ticket
for ticket in tickets_with_contribs:
print(ticket.contributors)
回想一下,这应该是不言自明的,但是哦。