Django中N:M类型及自连接

多对多关系

在models.py中添加新闻类,新闻类型类。新闻有多种类型,某种类型有多条新闻。

#新闻类型  类
class TypeInfo(models.Model):
    tname = models.CharField(max_length=20)
#新闻     类
class NewsInfo(models.Model):
    ntitle = models.CharField(max_length=20)
    ncontent =models.TextField()
    ndate = models.DateField(auto_now_add=True) #创建时设置为当前时间,可以被修改

    #通过ManyToManyField()建立TypeInfo和 NewsInfo 之间多对多的关系。
    newstype = models.ManyToManyField('TypeInfo')

这个类中属性多,所以在这个类中添加多对多的关系。
这个类似于外键的东西,最好命名时有两种类的影子。

之后生成迁移文件,然后执行迁移。


此时,在数据库中多了三个表,分别是新闻类的表app_typeinfo ,新闻表app_newsinfo,和关系表app_newsinfo_newstype,app_newsinfo_newstype的表结构为:id,newsinfo_id(关联app_newsinfo表)和typeinfo_id(关联app_typeinfo表)都是自动创建的


多对多的查询

可以把多到多的查询看作是一到多的查询:

如果查询非常的复杂,那么我们还可以是使用原生的sql语句进行查询:

语法格式为 list = 模型类.objects.raw(``` 原生的sql语句 ```,params=None,translations=None) ,

返回值是RawquerySet类型,然后for遍历lsit取值。

-----这个模型类NewsInfo或者TypeInfo都可以。

  • list = NewsInfo.objects.raw(select *...)

自连接

Django中N:M类型及自连接_第1张图片

如何让自己连接自己,这是我们将上一级的id定义为外键: parentid = models.ForeignKey('self', null=True, blank=True)

  • self表示自己连接自己,null和blank必须为True。因为上一级可以为空。

你可能感兴趣的:(Django中N:M类型及自连接)