如何格式化从多对多关系访问的元素?

时间:2019-01-20 09:02:04

标签: python django

对这个菜鸟问题很抱歉,我刚刚开始学习Django。

我在一个模型中有很多关系,并且我正在尝试格式化该模型的输出以使其包含多对多关系中的所有元素。

我想出了如何访问它们的方法,就像使用self.toppings导致获得orders.Toppings.none一样。

现在,我返回了一个查询集。我假设我必须遍历查询集中的项目以设置字符串格式,但是我不确定如何执行该操作并返回字符串,除非我应该在重新调整之前将数据存储在新列表中。我试过了,它只是作为列表返回,但我不想将其格式化为列表,我是否需要在返回行内部进行迭代?

这是我的上下文代码:

class CreatedItem(models.Model):
    item = models.ForeignKey(MenuItem, on_delete=models.CASCADE, related_name="createdItem")
    toppings = models.ManyToManyField(Topping)

    def __str__(self):
        return f"{self.item} with {self.toppings.all()}"

当前格式为:

<QuerySet [<Topping: Ham>, <Topping: Sausage>]>

但是我只想将其格式化为“火腿肠”

我是否需要在return语句内使用for循环?

1 个答案:

答案 0 :(得分:0)

我们可以使用value_list来获取相应的需求字段值。但是首先我们要知道为什么得到这个回应。

假设我们有两个类似的模型

class Publication(models.Model):
    title = models.CharField(max_length=30)

    def __str__(self):
        return self.title

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    def __str__(self):
        return self.headline

我们正在将数据添加到发布模型

>>> p1 = Publication(title='The Python Journal')
>>> p1.save()
>>> p2 = Publication(title='Science News')
>>> p2.save()
>>> p3 = Publication(title='Science Weekly')
>>> p3.save()
>>> p4 = Publication(title='The Python Journal')
>>> p4.save()

以及在文章模型中,例如

>>> a1 = Article(headline='NASA uses Python')
>>> a1.save()
>>> a1.publications.add(p1, p2)
>>> a1.publications.add(p3, p4)

现在,如果我们想获得a1出版物的相应结果,我们将得到类似的结果

>>> a1.publications.all()
<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>

为什么我们实际上会收到此回复?这是因为我们将__str__的出版物定义为..

def __str__(self):
    return self.title

但是,如果我们只希望在文章回复中使用publication__title,则可以通过

>>> Article.objects.values_list('publications__title').get(pk=a1)
>>> <QuerySet [(Highlights for Children), (Science News), (Science Weekly), (The Python Journal)]>

希望这将有助于您理解。