python - “...匹配的查询不存在。” 错误,但对象显然确实存在
问题描述
我有一个lesson
模型:
class Lesson(models.Model):
list_name = models.CharField(max_length=50, primary_key=True)
def __str__(self):
return self.list_name
sound
型号:
class Sound(models.Model):
sound_hash = models.CharField(max_length=40, primary_key=True, editable=False)
lessons = models.ManyToManyField(Lesson, verbose_name="associated lessons", related_name="words")
还有一个test_pair
模型:
class TestPair(models.Model):
master_sound = models.ForeignKey(Sound, related_name="used_as_master")
user_sound = models.ForeignKey(Sound, related_name="used_as_user")
我的表格看起来像这样:
class SoundTestPairForm(ModelForm):
user_sounds = forms.ModelMultipleChoiceField(Sound.objects.all())
class Meta:
model = TestPair
fields = ['master_sound']
def __init__(self, *args, **kwargs):
super(SoundTestPairForm, self).__init__(*args, **kwargs)
self.fields['master_sound'] = forms.CharField()
self.fields['master_sound'].widget.attrs['readonly'] = 'readonly'
def clean(self):
cleaned_data = super(SoundTestPairForm, self).clean()
if 'user_sounds' not in cleaned_data.keys():
raise forms.ValidationError('You must select at least one sound to be compared')
cleaned_data['master_sound'] = Sound.objects.get(pk=self.fields['master_sound'])
return cleaned_data
这是抛出一个DoesNotExist
错误。回溯指向这一行:cleaned_data['master_sound'] = Sound.objects.get(pk=self.fields['master_sound'])
本地变量如下:
self
<SoundTestPairForm bound=True, valid=True, fields=(master_sound;associated_test;associated_lesson;user_sounds)>
cleaned_data
{'associated_lesson': u'pooooooooooooooooooooooop',
'associated_test': u'cats a',
'master_sound': u'ad27ec5e0d048ddbb17d0cef0c7b9d4406a2c33',
'user_sounds': [<Sound: Pants>]}
但是当我去python manage.py shell
,并导入我的模型时:
Sound.objects.get(pk=u'ad27ec5e0d048ddbb17d0cef0c7b9d4406a2c33')
<Sound: oombah>
它击中适当的对象。
这是我长期以来一直在处理的事情,而且非常令人沮丧。我试图改变我的逻辑,最终它最终抛出一个DoesNotExist
错误,不管我尝试什么。
有没有人有任何想法?
解决方案
我认为你应该更换:
Sound.objects.get(pk=self.fields['master_sound'])
和:
Sound.objects.get(pk=cleaned_data['master_sound'])
当表单有效时,cleaned_data
将包含其所有字段的键和值,您也可以在您的问题中看到这一点(本地变量段落)。
一般来说,您应该在各个clean_<fieldname>
方法中进行验证。所以:
def clean_master_sound(self):
master_sound_key = self.cleaned_data.get('master_sound')
try:
master_sound=Sound.objects.get(pk=master_sound_key)
except Sound.DoesNotExist:
raise forms.ValidationError("Sound with id: %s does not exist", master_sound_key)
return master_sound
推荐阅读
- python - 覆盖 BaseHTTPRequestHandlerClass
- asp.net - Silverlight 5.1 应用程序在移动到新服务器时中断
- shiny - 有多个输入进入多个图表,但 5 个中只有 3 个在工作
- apache - 允许来源不适用于 apache2 上的多个域
- reactive-programming - 我使用项目反应器或()运算符的问题
- javascript - 如何知道实时更新何时结束 - Cloud Firestore ionic 4 with angular
- django - 在 django 信号中捕获一些值
- scala - 在 Spark Catalyst 代码生成期间,具有转义字段名称的 Scala 案例类引发错误
- javascript - 如何在 Lodash Get 中使用泛型类型?
- flow-project - 在路线中添加公交车站?(流,相扑)