Skip to main content
 首页 » 编程设计

python之Model.py 中的 Django 多个类

2025年05月04日24傻小

我是 Django 和 Python 的新手。我正在尝试创建一个保姆数据库,其中一个可以具有多个字段的对象是教育。我的第一个保姆有 2 个资格,这会产生错误且不会显示。

Error Message

View .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> 

您可以对引用数据执行类似的操作。