【问题标题】:Django Save Many to Many Field - no default valueDjango 保存多对多字段 - 无默认值
【发布时间】:2014-10-02 03:00:43
【问题描述】:

我已经尝试了一个多星期来使用 save(commit=False) 保存一个具有一个 ManyToMany 字段的新模型对象,但我一直遇到同样的错误。我已经尝试了 10 多种不同的方法,但都无法解决这个问题。在此先感谢您的帮助!参见下面的相关代码:

DatabaseError at /createRezidio/ (1364, "Field 'vquestions' doesn't have a default value")

    ['/Users/matthewbaron/Desktop/Nonsense/Loeb Land/source/commapp',
     '/Library/Python/2.7/site-packages/virtualenv-1.9.1-py2.7.egg',
     '/Library/Python/2.7/site-packages/setuptools-5.4.1-py2.7.egg',
     '/Library/Python/2.7/site-packages/distribute-0.6.28-py2.7.egg',
     '/Library/Python/2.7/site-packages/MySQL_python-1.2.4-py2.7-macosx-10.9-intel.egg',
     '/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
     '/Library/Python/2.7/site-packages',
     '/Library/Python/2.7/site-packages/PIL']

模型.py

class Questions(models.Model):
    userId = models.ForeignKey(User)
    question = models.TextField()
    approved = models.BooleanField(default=False)

    def __unicode__(self):
        return "%s" % (self.question)

class Profiles(models.Model):
    userId = models.ForeignKey(User)
    university = models.CharField(max_length = 60)
    universityYear = models.CharField(max_length = 60, choices=GRADE_CHOICES)
    gpa = models.DecimalField(max_digits = 4, decimal_places = 3, validators=   [MinValueValidator(0), MaxValueValidator(5)])
    major = models.CharField(max_length = 60)
    resumeText = models.TextField(help_text = 'Paste text of resume here:')
    vquestions = models.ManyToManyField(Questions, blank = True, null = True, choices = VID_QUESTIONS)
    resumeFile = models.FileField(upload_to = file_name_resume)
    video1 = models.FileField(upload_to = file_name_video1)
    video2 = models.FileField(upload_to = file_name_video2)
    video3 = models.FileField(upload_to = file_name_video3)
    video4 = models.FileField(upload_to = file_name_video4)
    userPhoto = models.ImageField(upload_to = file_name_photo)

    def __unicode__(self):
        return "%s, %s, %s, %s, %s, %s, 

views.py

def createRezidio(request):

    if request.method == 'POST':
        form = AutoRezidioForm(request.POST, request.FILES)
        if form.is_valid():
            newprof = form.save(commit=False)
            newprof.userId = request.user
            newprof.save()

            return HttpResponseRedirect("/viewRezidio/")
    else:
        form = AutoRezidioForm() # A empty, unbound form

    if request.user.groups.filter(name="recruiter").count() > 0:
        return render_to_response(
            "users/base_rezidio.html",
            {'form': form, 'type' : 'recruiter'},
            context_instance=RequestContext(request)
        )

        return render_to_response(
            "users/base_rezidio.html",
            {'form': form, 'type' : 'student'},
            context_instance=RequestContext(request)
        )

forms.py

class AutoRezidioForm(ModelForm):   
    class Meta:
        model = Profiles
        exclude = ['userId']
    vquestions = forms.ModelMultipleChoiceField(queryset = Questions.objects.all().filter(approved = True), widget=SelectMultiple)

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    关于这个:

    vquestions = models.ManyToManyField(Questions, blank = True, null = True, choices = VID_QUESTIONS)
    

    尝试使用limit_choices_to (docs) 而不是使用choices = 定义一组选项。这可以在模型上完成,并将影响使用该模型的所有模型形式上的可用选择。这也意味着您不必在 forms.py 中定义查询集;您可以向limit_choices_to 传递一个附加参数,以仅允许关联已批准的问题。

    由于您将commit = False 与涉及多对多字段的表单一起使用,我相信您还需要使用 save_m2m (docs) 才能正确保存内容。

    【讨论】:

    • 感谢您的帮助!我会尝试一下,然后就它的工作原理与您联系。然后就像在ManyToManyField上的models.py中说limit_choices_to = {'approved': True}一样简单,这有望缓解问题吗?谢谢!
    • 我相信是这样,但我承认我没有对此进行测试。同时使用它和我提到的保存 m2m 的东西,如果它一直给你带来任何麻烦,请告诉我。
    • 所以我摆脱了forms.py中的手动vquestions表单字段,在models.py中添加了limit_choices_to,并将form.save_m2m()添加到我的views.py函数中,但我仍然得到“DatabaseError在 /createRezidio/(1364,“字段 'vquestions' 没有默认值”)“。有什么想法吗?再次感谢您的帮助!
    • 澄清:页面加载或您尝试保存时是否弹出错误(我假设是后者)?自从您将 null=True 放入 vquestions 的模型定义中后,您的数据库是否已同步?这个帖子也可能有帮助:stackoverflow.com/questions/8073734/… 很抱歉我的原始答案没有解决问题。
    • 是的,它在 newprof.save() 上弹出。我现在在 PhpMyAdmin (NULL) 中为 vquestions 添加了一个默认值并通过了 newprof.save()!但是现在,在 form.save_m2m() 上,它显示“DatabaseError at /createRezidio/ (1146, “Table 'commappfin.rezidio_profiles_vquestions' 不存在”)”,所以我现在正试图解决这个问题。 commappFin 是 settings.py 中表示的数据库名称。有时,我的 django 应用程序只是停止与数据库交互,出于某种原因我必须创建一个新应用程序。
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 2014-02-26
    • 1970-01-01
    • 2018-09-30
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    相关资源
    最近更新 更多