python - Model.py 中的 Django 多个类
问题描述
我是 Django 和 Python 的新手。我正在尝试创建一个保姆数据库,其中一个可以有多个字段的对象是教育。我的第一个保姆有 2 个资格,这会产生错误并且不会显示。
视图.py
from django.shortcuts import render, get_object_or_404, get_list_or_404
from .models import Babysitter, Education, Work, Reference
# Create your views here.
def all_babysitters(request):
babysitters = Babysitter.objects.all()
return render(request, "babysitters.html", {"babysitters": babysitters})
def babysitter_profile(request, id):
"""A view that displays the profile page of a registered babysitter"""
babysitter = get_object_or_404(Babysitter, id=id)
reference = get_object_or_404(Reference)
education = get_object_or_404(Education)
return render(request, "babysitter_profile.html", {'babysitter': babysitter, 'education': education, 'reference': reference} )
模型.py
from django.db import models
from datetime import datetime
# Create your models here.
class Babysitter(models.Model):
list_display = ('firstName', 'lastName', 'minderType')
firstName = models.CharField(max_length=50, blank=True, null=True)
lastName = models.CharField(max_length=50, blank=True, null=True)
minderType = models.CharField(max_length=50, blank=True, null=True)
image = models.ImageField(upload_to='images')
phone = models.CharField(max_length=20, blank=True, null=True)
email = models.CharField(max_length=50, blank=True, null=True)
address1 = models.CharField(max_length=100, null=True)
address2 = models.CharField(max_length=100, null=True)
city = models.CharField(max_length=20, null=True)
county = models.CharField(max_length=100, null=True)
eircode = models.CharField(max_length=7, null=True)
biography = models.TextField(max_length=280,blank=True)
def __str__(self):
return self.firstName + ' ' + self.lastName
class Education(models.Model):
babysitter = models.ForeignKey(Babysitter)
school = models.CharField(max_length=50)
qualification = models.CharField(max_length=50)
fieldOfStudy = models.CharField(max_length=50)
dateFrom = models.DateField(auto_now=False, auto_now_add=False)
dateTo = models.DateField(
auto_now=False, auto_now_add=False, null=True, blank=True)
current = models.BooleanField(default=False)
graduated = models.BooleanField(default=False)
def __str__(self):
return self.school
class Work(models.Model):
babysitter = models.ForeignKey(Babysitter)
family = models.CharField(max_length=50)
role = models.CharField(max_length=50)
location = models.CharField(max_length=50)
dateFrom = models.DateField(auto_now=False, auto_now_add=False)
dateTo = models.DateField(
auto_now=False, auto_now_add=False, null=True, blank=True)
current = models.BooleanField(default=False)
def __str__(self):
return self.work
class Reference(models.Model):
babysitter = models.ForeignKey(Babysitter)
refFamily = models.CharField(max_length=50)
contact = models.CharField(max_length=50)
location = models.CharField(max_length=50)
email = models.CharField(max_length=50, blank=True, null=True)
reference = models.CharField(max_length=300)
date = models.DateField(auto_now=False, auto_now_add=False)
def __str__(self):
return self.refFamily
有人可以帮忙吗?我要把头发拔出来。谢谢
解决方案
您没有将足够的信息传递到调用中以获取 Reference 和 Education 对象:
babysitter = get_object_or_404(Babysitter, id=id)
reference = get_object_or_404(Reference, babysitter_id=babysitter.id)
education = get_object_or_404(Education, babysitter_id=babysitter.id)
get_object_or_404 ()函数是在下面调用get()的快捷方式,并且get()
只返回一个对象(返回多个将导致您看到的异常)。
如果您想查看多个对象,请不要使用get_object_or_404
快捷方式(我个人认为那些“快捷方式”方法很难看)。相反,将其更改为:
education_qs = Education.objects.filter(babysitter_id=babysitter.id)
然后遍历该查询集以获取结果:
for ed in education_qs:
# Get some data
school = ed.school
如果这样更容易,您可以在 HTML 模板中循环查询集。
更新:这是一个更好的答案,展示了如何使用查询集:
def babysitter_profile(request, id):
"""A view that displays the profile page of a registered babysitter"""
babysitter = get_object_or_404(Babysitter, id=id)
reference_qs = Reference.objects.filter(babysitter_id=babysitter.id)
education_qs = Education.objects.filter(babysitter_id=babysitter.id)
return render(request, "babysitter_profile.html", {
'babysitter': babysitter,
'education_qs': education_qs,
'reference_qs': reference_qs}
)
然后,在您的 HTML 模板中,您可以执行以下操作来显示保姆上过的学校(在项目符号列表中):
<ul>
{% for ed in education_qs %}
<li>{{ ed.school }}</li>
{% endfor %}
</ul>
您可以对参考数据执行类似的操作。
推荐阅读
- typescript - 带有道具的 [Material UI + Typescript] makeStyles / createStyles 的“textTransform”问题
- linux-kernel - 如何为 SDIO wifi 卡检测添加设备树节点?
- regex - 使用 sed 从每一行中删除整数
- javascript - 如何从highchart中的各个位置开始半圆甜甜圈图角度?
- django - django:mysql:error(1045, "Access denied for user 'root'@'localhost' (using password: NO)")
- sql - 在过滤其中一列时选择对
- javascript - 如何在 Nuxt 的 asyncData 方法中获取用户的 IP?
- reactjs - 无法构建反应项目 aws
- react-redux - 使用 Redux-Saga 的问题
- php - Codeigniter 编辑(检查重复 + 如果未找到重复则允许更新)