Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型继承_Django_Django Models_Django Forms - Fatal编程技术网

Django模型继承

Django模型继承,django,django-models,django-forms,Django,Django Models,Django Forms,我正在尝试修复我网站上的rsvp系统。我有一个联系人模型,它链接到用户模型。来宾模型链接到联系人和事件模型 class Contact(models.Model): first_name = models.CharField(_("First name"), max_length=30, ) last_name = models.CharField(_("Last name"), max_length=30, ) user = models.ForeignKey(User, unique=Tru

我正在尝试修复我网站上的rsvp系统。我有一个联系人模型,它链接到用户模型。来宾模型链接到联系人和事件模型

class Contact(models.Model):
first_name = models.CharField(_("First name"), max_length=30, )
last_name = models.CharField(_("Last name"), max_length=30, )
user = models.ForeignKey(User, unique=True)
dob = models.DateField(_("Date of birth"), blank=True, null=True)
email = models.EmailField(_("Email"), blank=True, max_length=75)
notes = models.TextField(_("Notes"), max_length=500, blank=True)
create_date = models.DateField(_("Creation date"))

class Guest(models.Model):
event = models.ForeignKey(Event, related_name='guests')
contact = models.ForeignKey(Contact, related_name='guests')
attending_status = models.CharField(max_length=32, choices=ATTENDING_CHOICES, default='no_rsvp')
number_of_guests = models.SmallIntegerField(default=0)
comment = models.CharField(max_length=255, blank=True, default='')
updated = models.DateTimeField(blank=True, null=True)

def _get_email(self):
    return u'%s' % (self.contact.email)
email = property(_get_email)

....
我尝试在Guest模型的基础上修复RSVP表单:

class RSVPForm(forms.Form):
email = forms.EmailField()
name = forms.CharField(max_length=128)
attending = forms.ChoiceField(choices=VISIBLE_ATTENDING_CHOICES, initial='yes', widget=forms.RadioSelect)
number_of_guests = forms.IntegerField(initial=0)
comment = forms.CharField(max_length=255, required=False, widget=forms.Textarea)

def __init__(self, *args, **kwargs):
    if 'guest_class' in kwargs:
        self.guest_class = kwargs['guest_class']
        del(kwargs['guest_class'])
    else:
        self.guest_class = Guest
    super(RSVPForm, self).__init__(*args, **kwargs)

def clean_email(self):
    try:
        guest = self.guest_class.objects.get(email=self.cleaned_data['email'])
    except ObjectDoesNotExist:
        raise forms.ValidationError, 'That e-mail is not on the guest list.'

    if hasattr(guest, 'attending_status') and guest.attending_status != 'no_rsvp':
        raise forms.ValidationError, 'You have already provided RSVP information.'

    return self.cleaned_data['email']

def clean_number_of_guests(self):
    if self.cleaned_data['number_of_guests'] < 0:
        raise forms.ValidationError, "The number of guests you're bringing can not be negative."
    return self.cleaned_data['number_of_guests']

def save(self):
    guest = self.guest_class.objects.get(email=self.cleaned_data['email'])

    if self.cleaned_data['name']:
        guest.name = self.cleaned_data['name']

    guest.attending_status = self.cleaned_data['attending']
    guest.number_of_guests = self.cleaned_data['number_of_guests']
    guest.comment = self.cleaned_data['comment']
    guest.save()
    return guest
提交表单后,我发现以下错误:

无法将关键字“电子邮件”解析到字段中。选项包括:出席状态、评论、联系人、事件、id、来宾人数、已更新


在网上搜索了几个小时后,我仍然不明白为什么我在使用Guest.email时,选择列表中只有“contact”。它从contact.email中呈现其价值。

您模型中的客户没有“email”字段。它在您的联系人模型上

您没有提到哪一行触发了您的错误,但我猜这可能是其中之一:

guest = self.guest_class.objects.get(email=self.cleaned_data['email'])
如果您正在搜索通过给定电子邮件链接到联系人的客户,您将希望将其更改为使用
联系人\uuu电子邮件
,以便它为您加入:

guest = self.guest_class.objects.get(contact__email=self.cleaned_data['email'])

您的问题的一个根源可能是您认为您的模型之间存在继承关系,而我根本看不到这种关系。您有一个简单的ForeignKey关系,这应该适合您,只是不要将其与继承混淆,在继承中,您可以设置一个Guest通过子类化来继承Contact的属性。

,因为django的ORM在SQL级别工作。表/模型中没有“email”列(或定义的字段),只有python属性。Django不知道它需要连接到另一个表

相反,只需使用django的
\uu
连接/字段查找语法:

guest = self.guest_class.objects.get(contact__email=self.cleaned_data['email'])

Kekoa,你是对的。这正是问题所在。下一次我将进行追踪。你刚刚给我上了很好的一课。非常感谢。
guest = self.guest_class.objects.get(contact__email=self.cleaned_data['email'])