Django对数据库的访问,类似于SQL对数据库的访问,只是有一个相应的映射:
官网教程 中文教程 支持原始sql查询 (左边优秀文档,推荐官网文档)
1. 首先,看一下models的设计。这是从数据库直接迁移过来自动生成的,当然也可以自己写:
class OaChannelTable(models.Model):
channel_id = models.IntegerField(primary_key=True)
channel_name = models.CharField(max_length=45)
class Meta:
managed = False
db_table = 'oa_channel_table'
class OaPropTable(models.Model):
index_id = models.IntegerField(primary_key=True)
prop_id = models.IntegerField(db_column='prop_\u206fid') # Field renamed to remove unsuitable characters.
prop_name = models.CharField(max_length=45)
prop_typeid = models.IntegerField()
prop_typename = models.CharField(max_length=45)
prop_desc = models.CharField(max_length=100, blank=True, null=True)
type = models.CharField(max_length=45, blank=True, null=True)
class Meta:
managed = False
db_table = 'oa_prop_table'
unique_together = (('index_id', 'prop_id', 'prop_typeid'),)
class OaPropChannelTable(models.Model):
oaindex_id = models.AutoField(primary_key=True)
oachannel = models.ForeignKey(OaChannelTable, models.DO_NOTHING) #外键
index = models.ForeignKey(OaPropTable, models.DO_NOTHING) #外键
number = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'oa_prop_channel_table'
2. 接下来,看一下这三个表的关联查询和打印的结果(下面展示两种查询方式,原生sql和models的filter)
z = ""
p = 0
for k in OaPropTable.objects.raw('select * from oa_prop_table where prop_id = 7'):
print(k.type)
print(k.index_id)
print(OaPropChannelTable.objects.filter(index__index_id__exact = 2211).get())
print(OaPropChannelTable.objects.filter(index__index_id__exact = 2211).get().oachannel)
for e in OaPropChannelTable.objects.filter(index__index_id__exact = k.index_id):
print(e.oachannel.channel_id)
p = e.number
for m in OaChannelTable.objects.filter(channel_id = e.oachannel.channel_id):
z = m.channel_name
print(z)
print(p)
k = OaPropChannelTable.objects.filter(index__index_id__exact = 2211).get()
print(k.oaindex_id)
以上实现的是,通过一个表找到中间关联表,再关联另一个表:
(1)第一句好理解,就是一句sql。。
(2)OaPropChannelTable.objects.filter(index__index_id__exact = 2211) .get () 这句是关键。index__index_id ,两个id用双下划线关联
1> OaPropChannelTable是中间关联表,它有一个外键属性index。
2> OaPropTable表,它的主键index_id,index_id也是外键
控制台打印的内容:
OaPropChannelTable object (10910) 通过OaPropTable的index_id找到与之对应的OaPropChannelTable对象集,是一个queryset。get()方法只能在确定只有一个对象的时候调用。
(3)OaPropChannelTable.objects.filter(index__index_id__exact = 2211).get().oachannel 后面加了.oachannel
1> OaPropChannelTable 表,另一个外键属性oachannel。关联 OaChannelTable表
控制台打印的内容:
OaChannelTable object (1218) 通过OaPropChannelTable 的外键属性oachannel找到与之对应的OaChannelTable对象集,也是一个queryset。
ok!到此结束!