📅  最后修改于: 2023-12-03 15:24:43.423000             🧑  作者: Mango
ManyToManyField 是 Django 中一个常用的关系型字段,一般用于多对多的关联关系。然而,在默认情况下,ManyToManyField 保存的是关联对象的 id,而不是实际的关联对象。这在某些情况下可能会导致不便,比如想要在模板中直接显示关联对象信息时就很不方便。本文将介绍如何将 ManyToManyField 保存为值而不是 id,方便我们操作和展示数据。
首先,我们需要定义一个 ManyToManyField,比如:
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
这里,Book 类有一个 ManyToManyField,关联到 Author 类。
我们可以使用 ManyToManyField 的 through 属性,将 ManyToManyField 的值保存为关联对象,而不是 id。具体操作如下:
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=100)
authors = models.ManyToManyField(Author, through='BookAuthor')
class BookAuthor(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
这里,我们定义了一个中间模型 BookAuthor,它有两个 ForeignKey 字段,分别对应 Book 和 Author。
authors = models.ManyToManyField(Author, through='BookAuthor')
这样,当我们向 ManyToManyField 添加关联对象时,会创建一个 BookAuthor 对象,用于保存关联关系。
在模板中,我们可以直接使用 ManyToManyField 的关联对象,而不用再通过 id 去查找关联对象。比如:
{% for author in book.authors.all %}
{{ author.name }}
{% endfor %}
这样,就能直接使用 ManyToManyField 的关联对象信息了。
我们也可以使用 through_fields 属性,将 ManyToManyField 的值保存为关联对象,而不是 id。具体操作如下:
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=100)
authors = models.ManyToManyField(Author, through='BookAuthor', through_fields=('book', 'author'))
class BookAuthor(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
这里,我们定义了一个中间模型 BookAuthor,它有两个 ForeignKey 字段,分别对应 Book 和 Author。
authors = models.ManyToManyField(Author, through='BookAuthor', through_fields=('book', 'author'))
这样,当我们向 ManyToManyField 添加关联对象时,会创建一个 BookAuthor 对象,用于保存关联关系。
在模板中,我们可以直接使用 ManyToManyField 的关联对象,而不用再通过 id 去查找关联对象。比如:
{% for author in book.authors.all %}
{{ author.name }}
{% endfor %}
这样,就能直接使用 ManyToManyField 的关联对象信息了。
本文介绍了如何将 ManyToManyField 保存为值而不是 id,可以方便我们操作和展示数据。具体操作可以通过使用 through 或 through_fields 属性来实现。通过使用中间模型来处理关联关系,就可以将 ManyToManyField 的值保存为关联对象,而不是 id。