Django Model.py中的多个类

时间:2018-11-18 00:50:25

标签: python django

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

Error Message

views.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} )

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

有人可以帮忙吗?我要把头发拔出来。谢谢

3 个答案:

答案 0 :(得分:3)

您没有将足够的信息传递给调用以获取参考和教育对象:

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()仅返回单个对象(返回多个对象将导致您看到的异常)。 / p>

如果您想看到多个对象,则不要使用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>

您可以对参考数据执行类似的操作。

答案 1 :(得分:1)

我认为您应该设置一些parameters来获取特定的对象,而不是获取一堆对象。

就像做get_object_or_404的第一个实例一样。

reference = get_object_or_404(Reference,id=xx)
education = get_object_or_404(Education,id=yy)

答案 2 :(得分:1)

get_object_or_404仅返回1个对象。如果保姆的资格为“ 2”,请使用get_list_or_404,以防止发生异常。

babysitter = get_object_or_404(Babysitter, id=id)
education = get_list_or_404(Education, id=babysitter.id)

为防止发生MultipleObjectReturned异常。

相关问题