Django ManyToManyField 跨越中间表查询的方法

花开有时
花开有时
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍如何在Django中利用ManyToManyField自动生成的中间表进行数据查询。通过Article模型中的column字段,可以直接使用filter方法按栏目ID获取对应文章列表,无需手动操作中间表。

在Django模型中,使用ManyToManyField会自动生成一个中间表,例如本例中的pyclub_article_column。

from django.db import models

# Create your models here.

class Column(models.Model):
 id = models.AutoField(u'序号',primary_key=True,auto_created=True)
 name = models.CharField(u'名字',max_length=100)
 published = models.DateField(u'发布时间',auto_now_add=True)

 def __str__(self):
 return self.name

 class Meta:
 verbose_name = '栏目'
 verbose_name_plural = '栏目列表'
 ordering = ['id'] # 按照哪个栏目排序

class Article(models.Model):
 id = models.AutoField(u'序号',primary_key=True,auto_created=True)
 title = models.CharField(u'标题',max_length=100,default='')
 content = models.TextField(u'内容',default='')
 column = models.ManyToManyField(Column,verbose_name='归属栏目')
 published = models.DateField(u'发布时间',auto_now_add=True,null=True)

 def __str__(self):
 return self.title

 class Meta:
 verbose_name = '文章'
 verbose_name_plural = '文章列表'
 ordering = ['id'] # 按照哪个文章排序

该中间表pyclub_article_column的结构如下: | id | article_id | column_id | |-----|------------|-----------| | 370 | 411 | 146 | | 371 | 412 | 146 | | 372 | 413 | 165 | | 373 | 414 | 158 | | 374 | 415 | 151 |

+-----+------------+-----------+
| id | article_id | column_id |
+-----+------------+-----------+
| 370 | 411 | 146 |
| 371 | 412 | 146 |
| 372 | 413 | 165 |
| 373 | 414 | 158 |
| 374 | 415 | 151 |

我的目标是通过column_id获取对应栏目下的所有文章列表。之前一直困惑于如何直接操作中间表,现在发现可以直接将结果集column作为对象处理,问题便简化了。

list_info = Article.objects.filter(column=id)

尽管Article表中没有直接存储column字段,但在Django的model.py中通过ManyToManyField建立了关联关系。因此,在view.py中,可以通过Article.objects直接使用filter方法进行类别查询。

以上即为Django ManyToManyField跨越中间表查询的完整方法,希望能对大家有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表