我试图根据外键将国家与大陆连接起来"ckey";。我试过用filter和.raw,但没有用。我试着直接在HTML上使用它,但它说它不能赞扬它;大陆->国家>城市->quot;使用Django。
型号
from django.db import models
# Create your models here.
class Continents(models.Model):
ckey = models.CharField(max_length=10, primary_key=True)
continentName = models.CharField(max_length=50)
class country(models.Model):
countryNum = models.IntegerField(primary_key=True)
countryName = models.CharField(max_length=15)
countryBrief= models.TextField(max_length=500)
currency = models.CharField(max_length=15)
cost = models.FloatField(max_length=10)
cultures = models.TextField(max_length=300)
rulesBrief = models.TextField(max_length=200)
location = models.TextField(max_length=500)
ckey = models.ForeignKey('Continents', on_delete=models.PROTECT)
视图.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Continents, country
# Create your views here.
def home(request):
return render(request,"guide/home.html")
def continents(request):
continentdata = Continents.objects.all()
return render(request,"guide/Continents.html",{'Continents':continentdata})
def countrylist(request):
countries = country.objects.all()
first_person = country.objects.filter(ckey='as45914')
context = {
"first_person":first_person,
"countries":countries,
}
return render(request,"guide/countrylist.html",context=context)
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{{first_person}}
</body>
</html>
当我运行代码时收到一条奇怪的消息
如何链接这样的页面?例如";欧洲>英国>英国伦敦以下所有城市"使用Django。我知道如何做到这一点,所有国家>所有城市,但并非如此。
# Get list by Obj
continentObj = Continents.objects.get(ckey='as45914')
countryList = Country.objects.filter(ckey=cObj)
# Get List by Related Attribute
countryList = Country.objects.filter(ckey__ckey='as45914')
编辑
@OP几乎可以使用相关的属性。
假设你有三个型号的
class Continents():
name = charfield
class Country():
continents = Key(Continents)
class City():
country = Key(Country)
现在如何获得欧洲所有城市的
list_Of_Cities = City.objects.filter(country__continents__name='Europe')
编辑2
根据你最后的评论,你从过滤器中得到了一个Queryset(这是正确的!(
如果您知道过滤器将始终返回1个项目,请使用:
obj = country.objects.filter(field=value).first()
-抓取第一个(如果没有匹配项,则为None(obj = country.objects.get(field=value)
-Get1(如果查询返回零或大于1,将崩溃!(
从那里你只需要做obj.countryName
但是,如果过滤器可以返回多个匹配,以下是一些获取值的方法:
# QuerySet
# qs = <QuerySet [<country: country object (973)>]>
# Way 1:
names = qs.values('countryName')
# names = [{'countryName': '{name1}'}, {'countryName': '{name2}'},]
# (Array of Dicts)
# Way 2:
names = qs.values_list('countryName')
# names = [('{name1}'), ('{name2}'),]
# (Array of Tuples)
# Way 3:
names = qs.values_list('countryName', flat=True)
# names = ['{name1}', '{name2}',]
# (Array of Names)
# Way 4: (Just loop)
for i in qs:
i.countryName
对于viwes
def countrylist(request):
list_Of_Cities = country.objects.filter(ckey__ckey='as45914').values('countryName')
context = {
"list_Of_Cities":list_Of_Cities
}
return render(request,"guide/countrylist.html",context=context)
和HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% for i in list_Of_Cities %}
{{i.countryName}}
{% endfor %}
</body>
</html>