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)












原文地址:https://www.cnblogs.com/weigege2015/p/8717031.html