Django - 过滤外键

时间:2014-07-22 14:25:57

标签: python django

我在django中有关于过滤器的问题。请帮我。我想在单击l.category_name

时显示具有不同类别的产品对象

我的html(CategoryList.html):

{% for l in forms %}
<a href="/myapp/categorylist/{{l.category_id}}"><h2>{{ l.category_name }}</h2></a>
{% endfor %}

CategoryView.html

{{get_product.product_name}}

我的模特:

class Category(models.Model):
    category_id = models.AutoField(primary_key = True)
    category_name = models.CharField(max_length = 20)

    def __unicode__(self):
        return self.category_name

class Product(models.Model):
    product_id = models.AutoField(primary_key = True)
    product_name = models.CharField(max_length = 50)
    product_category = models.ForeignKey(Category)
    product_color = models.CharField(max_length = 30)
    def __unicode__(self):
        return self.product_name

我的观点:

def category_list(request):
    list = Category.objects.all()
    context = {'forms':list}
    return render(request,'webpage/CategoryList.html',context)

def category_view(request,category_id):
    all = Product.objects.all()
    if request.POST:
        get_id = Category.objects.get(category_id = request.POST['category_id'])
        get_category = Product.objects.get(product_category =
                                           request.POST['product_category'])
        get_category.product_category = get_id
        get_category.save()
        if get_category:
            get_product = Product.objects.filter(product_category__category_name =
                                                 request.POST['category_name'])

    context = {'get_product':get_product}
    return render(request,'webpage/CategoryView.html',context)

我在https://docs.djangoproject.com/en/1.6/topics/db/queries/阅读了文档,但我不明白。我知道我错了category_view

2 个答案:

答案 0 :(得分:3)

您的代码似乎存在很多问题。

首先,您不必在代码中声明ID。 Django会自动为您完成。因此,categor_idproduct_id是不必要的。

其次, 删除.POST检查。你没有发布任何东西。

第三,

get_id = Category.objects.get(category_id = request.POST['category_id']) # returns a category, not an id
get_category = Product.objects.get(product_category =
                                       request.POST['product_category']) # returns the product list, not a category
get_category.product_category = get_id

相同
category = Category.objects.get(category_id = request.POST['category_id'])
product_list = Product.objects.get(product_category = category)

第四,不要在模板中硬编码URL。请改用{% url %}标记。

最后, 然后,您可以将此product_list传递给模板

context = {'product_list':product_list}
return render(request,'webpage/CategoryView.html',context)

答案 1 :(得分:0)

存储外键的方式是通过自动字段(ID)。由于“类别”是“产品”的外国字段,因此当您创建记录条目时,类别的ID将存储在产品表的“product_category”字段中。

我认为你的代码有点令人困惑,因为你正在尝试做django自动为你做的事情。例如,一旦定义了外键,外键表记录的id就会自动存储,您不必获取'category'条目的id并将其存储在products表条目中。

您要实现的目标很简单,假设您拥有category_name而没有别的,获取类别表条目的ID,

category_object = Category.objects.get(category_name = category_name)
category_id = category_object .id

如果您已经拥有类别ID,那么您可以跳过上述步骤,只需使用该ID查询产品表以获取所需记录

Product.objects.filter(product_category = category_id)

在模板中,您可以遍历这些产品记录并显示所需的内容。

BTW,使用.update()方法更新任何字段而不是save()方法。

这样的事情: Entry.objects.all()。更新(博客= b)的

阅读查询帮助非常值得您花时间阅读。 Django queries