Django过滤结果

时间:2014-11-19 07:19:10

标签: python django filter

我对如何执行任务感到有些困惑,所以想知道是否有人可以提供帮助。

我有这个模型和模型形式:

class Prefabrication(models.Model):
    prefabrication_id = models.AutoField(primary_key=True)
    matlist = models.ForeignKey(MatList, blank=True, null=True)
    sizelist = models.ForeignKey(SizeList, blank=True, null=True)
    quantity = models.IntegerField(blank=True, null=True)
    workpack = models.ForeignKey(Workpack, blank=True, null=True)
    code = models.CharField(max_length=50)
    lineclass = models.ForeignKey(Lineclass, blank=True, null=True)


class CreateNewPrefabForm(forms.ModelForm):
    class Meta:
        model = Prefabrication
        fields = ('prefabrication_id', 'matlist', 'sizelist', 
                  'quantity', 'workpack', 'lineclass')

这表示我用来收集用户信息的表单。

我试图根据matlist和sizelist从查找表中获取某个值 用户给出的值。

我尝试过使用它:

if request.method == 'POST':
    if createprefabcons['newprefab'].is_valid():
        item = Lineclass.objects.filter(itemname__icontains=createprefabcons['newprefab'].cleaned_data['matlist'],
                                        dn1__icontains=createprefabcons['newprefab'].cleaned_data['sizelist'],
                                        lineclassname__icontains=createprefabcons['newprefab'].cleaned_data['matlist'])
        createprefabcons['newprefab'].cleaned_data['code'] = item
        createprefabcons['newprefab'].save()
        return HttpResponseRedirect('/')

使用过滤器尝试获取过滤返回的项目的代码。据我所知 应该只是过滤器搜索返回的一个项目,并且该项目将具有我希望在用户提供搜索详细信息后添加的代码。

所有内容都可以很好地存储到数据库中,但是代码字段是空白的,所以要么我做错了,要么没有匹配的值,如果过滤完成,则必须匹配。任何人都可以提出一些建议。

非常感谢。

1 个答案:

答案 0 :(得分:2)

filter()会返回QuerySet(),其中类似于并且包含模型对象。因此,即使只有一个结果,您也可能需要将其从返回的列表中拉出来。

item = Lineclass.objects.filter()[0]

如果您希望只有一个条目,最好使用.get(),这也会检查您的假设,因为如果返回多个条目,它将抛出异常。也许是这样的:

try:
    item = Lineclass.objects.get(itemname__icontains=createprefabcons['newprefab'].cleaned_data['matlist'], dn1__icontains=createprefabcons['newprefab'].cleaned_data['sizelist'], lineclassname__icontains=createprefabcons['newprefab'].cleaned_data['matlist'])
except Lineclass.DoesNotExist:
    # handle case where no items are found
    do_stuff()
createprefabcons['newprefab'].cleaned_data['code'] = item