大家在搭建网站时,无可避免的必须设计方案完成页面的用户系统,我们应该完成包含新用户注册、账号登录、用户认证、销户等服务,Django做为完美主义者最终架构,它默认设置使用auth_user表来存储用户数据信息,下面我们就来看看Django多对多使用through自定中间表
多对多中间表详细说明
众所周知针对ManyToMany字段,Django使用的是下一张中间表的形式。依据这下一张表,来关联ManyToMany的彼此。下面我们就依据1个实际的事例,详细解说中间表的应用。
默认设置中间表
class Person(models.Model): name=models.CharField(max_length=128) def __str__(self): return self.name class Group(models.Model): name=models.CharField(max_length=128) members=models.ManyToManyField(Person) def __str__(self): return self.name
在Group模型中,依据members字段,以ManyToMany的方式和Person建立模型了关联。
让我们一起来看看,中间表是一个什么样:
最先有某列id,这也是Django默认设置使用的,没什么可说的。然后就是Group和Person的id列,这也是默认设置前提下,Django关联二张表中方法。如果你想要设定关联列,能使用to_field主要参数。
由此可见在中间表中,并不是将二张表中数据储存在一块,而是用id的关联开展投射。
依据through自定中间表
一般情况下,普通多对多早已足够,不用自身建立下一张关系图。不过一些状况很有可能更加复杂一点儿,例如如果你想要储存某些人添加某一分类的时长?想储存接戏的原因吧?
Django带来了一个through参数,用以特定正中间实体模型,你能将类似接戏时长,邀约缘故等其它字段名放到这一正中间实体模型内。事例如下所示:
modle:
from django.db import models class Person(models.Model): name=models.CharField(max_length=128) def __str__(self): return self.name class Group(models.Model): name=models.CharField(max_length=128) members=models.ManyToManyField(Person,through='Membership') def __str__(self): return self.name class Membership(models.Model): person=models.ForeignKey(Person,on_delete=models.CASCADE) group=models.ForeignKey(Group,on_delete=models.CASCADE) date_joined=models.DateField()#进组时间 invite_reason=models.CharField(max_length=64)#邀请原因
view:
class PersonViews(ModelViewSet): queryset=Person.objects.filter() serializer_class=PersonSerializers class GroupViews(ModelViewSet): queryset=Group.objects.filter() serializer_class=GroupSerializers class MembershipViews(ModelViewSet): queryset=Membership.objects.filter() serializer_class=MembershipSerializers
serializer:
from.models import Person,Group,Membership class MembershipSerializers(serializers.ModelSerializer): class Meta: model=Membership fields='__all__' class PersonSerializers(serializers.ModelSerializer): class Meta: model=Person fields='__all__' class GroupSerializers(serializers.ModelSerializer): def to_representation(self,instance): representation=super(GroupSerializers,self).to_representation(instance) representation['members']=[] for i in PersonSerializers(instance.members,many=True).data: reason=MembershipSerializers(instance.membership_set.get(group=instance.id,person=i['id'])).data['invite_reason'] i['invite_reason']=reason representation['members'].append(i) return representation class Meta: model=Group fields='__all__'
从Membership角度,他是建立量到两个模型(Group,Person)的多对1关系,Django在启动时,会自动在其关联的模型上建立"[model]_set"的属性,就想常规的多对一关系一样——实际上他就是常规的多对一关系,只不过Person让其充当另外的角色罢了。
reason=MembershipSerializers(instance.membership_set.get(group=instance.id,person=i[‘id’])).data[‘invite_reason’]
instance.membership_set.get(group=instance.id,person=i[‘id’])group和person联合查出邀请原因
person和group模型上membership对象的默认名称都将为membership_set.所以通过instance.membership_set.get()可以查看group下的所有关系
person下的所有membership:
#def to_representation(self,instance): #representation=super(PersonSerializers,self).to_representation(instance) #representation['reason']=MembershipSerializers(instance.membership_set,many=True).data #return representation
综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来不帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128845.html
摘要:为关联关系设置约束子模型的等于父模型的上面设置的字段的值子类实现这个抽象方法通过上面代码看到创建实例时主要是做了一些配置相关的操作,设置了子模型父模型两个模型的关联字段和关联的约束。不过当查询父模型时,可以预加载关联数据。 Database 模型关联 上篇文章我们主要讲了Eloquent Model关于基础的CRUD方法的实现,Eloquent Model中除了基础的CRUD外还有一个...
摘要:而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用,表明这是多对多的关联关系。理解多对一和多对多两种关联关系我们分别使用了两种关联数据库表的形式和。表明一种一对多的关联关系。 设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库。我们把写好的文章永久地保存在数据库里,...
摘要:默认情况下,这个管理器的名字为,其中是源模型的小写名称。创建一个新的对象,将它保存并放在关联的对象集中。从关联的对象集中删除指定的模型对象。 模型关系 简介 关系数据库的威力体现在表之间的相互关联,Django提供了三种最常见的数据库关系:多对一(many-to-one),多对多(many-to-many),一对一(one-to-one) 多对一关系 多对多关系 一对一关系 多对一...
阅读 912·2023-01-14 11:38
阅读 879·2023-01-14 11:04
阅读 743·2023-01-14 10:48
阅读 1993·2023-01-14 10:34
阅读 943·2023-01-14 10:24
阅读 823·2023-01-14 10:18
阅读 500·2023-01-14 10:09
阅读 573·2023-01-14 10:02