如何使用django根据外键链接页面



我试图根据外键将国家与大陆连接起来"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>

最新更新