django ORM之manytomany跨表
共三张表:文章表,文章与文章类别关系表,文章类别表,文章表中有manytomany字段
1.models.py
class Article(models.Model): nid = models.BigAutoField(primary_key=True) title = models.CharField(verbose_name='文章标题', max_length=128) summary = models.CharField(verbose_name='文章简介', max_length=255) tags = models.ManyToManyField( to="Tag", through='Article2Tag', through_fields=('article', 'tag'), )
class Article2Tag(models.Model): article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid', on_delete=models.CASCADE) tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid', on_delete=models.CASCADE) class Meta: unique_together = [ ('article', 'tag'), ]
class Tag(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name='标签名称', max_length=32) blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid',on_delete=models.CASCADE)
2.跨表
(1)正向跨表:
需求:点击文章分类,查看某一分类下的文章,如图,标签下的 查看“ python开发之路”这一类别下的文章
obj = models.Article.objects.filter(blog__site=username) # obj为这个人的博客园里的所有文章集合 jqueryset
tag_articles = obj.filter(tags__nid=tag.nid) # 多对多跨表,正向跨表,从文章表跨到标签表,利用article表中的manytomany字段tags,nid为tag表里面的nid,双下划线指向另一个表
(2)反向跨表:
需求:已知文章的nid,获取文章的标签名
filter反向跨表格式:(要跨的指向的表)小写的表名__列名
m = models.Tag.objects.filter(article__nid=13).first() # 对tag表来说,指向article表是反向跨表,小写的表名__列名即article__nid 来求tag名
print( m.title)