Python 如何在Django 1.8中连接表
我曾尝试访问django模板中的连接数据,但没有任何效果,非常感谢您的帮助Python 如何在Django 1.8中连接表,python,mysql,django,Python,Mysql,Django,我曾尝试访问django模板中的连接数据,但没有任何效果,非常感谢您的帮助 Model1(): project_code = Foreignkey(another table1) shot_code = charfield(primary_key = True) shot_name = charfield() sequence_name = Integerfield() Model2(): vendor_id = Foreignkey(another table2
Model1():
project_code = Foreignkey(another table1)
shot_code = charfield(primary_key = True)
shot_name = charfield()
sequence_name = Integerfield()
Model2():
vendor_id = Foreignkey(another table2)
shot_code = Foreignkey(Model1, on_delete= models.CASCADE)
shot_rate = integerfield()
shot_bid = integerfield()
我想展示一下
Select * from Model1 a, Model2 b, where a.shot_code = b.shot_code
and model1.project_code = "XXX"
要在模板中访问的列包括
1. Shot code
2. Shot name
3. Sequence name
4. Shot rate
5. Shot bid
6. Vendor id
我尝试了以下方法
1. Using Select_related
result = only values of model2 is displayed
unable to access model1's data,
error = 'QuerySet' object has no attribute model1
您可以在Model2中使用Model1查询集的对象并获取数据,请参见以下示例:
model1obj = Model1.objects.get(project_code = "XXX")
model2obj = Model2.objects.get(shot_code = model1obj)
# now access all the fields using model1obj and model2obj
您希望它返回一个或多个实例吗?最好的方法仍然是使用
select_related
,例如:
Model2.objects.filter(shot_code__project_code=<your value>).select_related("shot_code")
和往常一样,我建议不要将您的
ForeignKey
命名为vendor\u id
,因为它会将真实id放在vendor\u id\u id
下,命名会有点不清楚。这导致1。在db 2上多次点击。在Djago querysets中访问templateIn中的数据时出现混乱,无法多次点击db获取更多信息检查OMG!这件事很有帮助,为什么Django中的连接必须如此复杂,我了解了我所做的错失,感谢解决方案,我错失了使用注释和值。我将按照您的建议重新命名外键,谢谢您总是可以跳过注释并使用.values()
和相关名称,例如“shot\u code\uu shot\u code”,只是以后在模板中使用不会那么友好;)理解了,但仍然出于好奇,有没有简单的方法来实现这一点?我不知道(但我仍然碰巧发现了一些未知的django特性),至少在直接连接结果方面是这样。select related的工作原理类似,但是您需要通过关系访问所有值(例如,instance.shot\u code.shot\u code
),当然,创建对象和从db.com检索所有字段会增加额外的开销,此处的开销是使用引用/关系访问单个列,而不是直接连接:(
Model2.objects.filter(shot_code__project_code=<your value>).annotate(
sequence_name=F("shot_code__sequence_name"),
shot_name=F("shot_code__shot_name"),
real_shot_code=F("shot_code__shot_code")
).values(
"sequence_name", "shot_name", "real_shot_code", "shot_rate", "shot_bid", "vendor_id"
)