检索所有数据库对象及其相关对象Django

时间:2019-01-22 20:38:56

标签: django

我目前正在学习Django,但发现将ManyToMany字段包围起来有点困难。我正在使用中间模型来管理我的关系。

我有三种模式; TicketUserTicketUserRelation。 我希望能够查询票证模型,并检索其相应的用户对象和票证对象。我将如何去做?

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

编辑:我正在使用中间模型,以便以后可以轻松添加诸如加入日期之类的内容。

2 个答案:

答案 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)

回想一下,这应该是不言自明的,但是哦。