如何在django中使用外键接受字段值而不是其id?

时间:2016-05-19 06:48:35

标签: python django django-views

我已经创建了一个基于类别的产品内容过滤的复选框。因此,当用户点击任何复选框时,只显示具有该类别的书籍。在视图中,我传递复选框字段的值(类别名称)从模板中获取但是在过滤时,外键是期望pk(id)而不是字段值。我得到这样的错误,invalid literal for int() with base 10: '<category name>'。那么是否可以使外键接受值而不是id?< / p>

Models.py,

class Add_cat(models.Model):
    category = models.CharField("Name",max_length=25,unique=True)

    def __unicode__(self):
        return u'{0}'.format(self.category)

class Add_prod(models.Model):
    book = models.CharField("Book Name",max_length=40)
    author = models.CharField("Author",max_length=30)
    price = models.PositiveIntegerField("Price")
    image = models.ImageField(upload_to='images',null=True)
    cat = models.ForeignKey(Add_cat,on_delete=models.PROTECT)

模板文件,

{% for i in products %}
                <input type="checkbox" name="cat_name" value="{{i.cat}}">{{i.cat}}<br>  
{% endfor %}

Views.py,

def welcome_user(request):        
    if 'cat_name' in request.GET:
        filter_category = request.GET.get('cat_name')
        my_products = Add_prod.objects.filter(cat__in = filter_category) 
        context = { "products":my_products}
    else:
        my_products = Add_prod.objects.all()
        context = { "products":my_products}
    return render(request,"welcome-user.html",context)

3 个答案:

答案 0 :(得分:1)

您可以查看category字段本身:

my_products = Add_prod.objects.filter(cat__category__in=filter_category)

查看有关其工作原理的documentation

以上,仅适用于filter_categorylist的情况。如果它是一个字符串,你可以过滤如下:

my_products = Add_prod.objects.filter(cat__category=filter_category)

答案 1 :(得分:1)

你可以试试这个,它会对你有帮助:

requestEntries.publish(re -> {
    Observable<...> x = re.filter(...<featured>...).map(...).doOnNext(...Log.i(...));
    Observable<...> y = re.filter(...<done>...).map(...).doOnNext(...Log.i(...));
    return x.mergeWith(y);
})

答案 2 :(得分:1)

您的代码有两个问题

  1. 您需要查找字段而不是外键
  2. 使用__in,您认为该类别等于filter_category中的任何一个字符。
  3. 因此要修复,请使用字段查找并删除__in

    Add_prod.objects.filter(cat__category=filter_category)