在django admin中配置搜索域是一个外键时的处理方法


Posted in Python onMay 20, 2020

python 2.7.11

django 1.8.4

错误内容:related Field has invalid lookup: icontains

我原来默认认为在处理外键搜索的时候,django会自动将该外键的行数据以str()化之后进行搜索,但其实并不是这样的,如果将外键加入到搜索域中,需要明确写出来。

这个是我从网上查到的解决方案,测试可用,如下:

models.py 文件

# coding:utf8
from django.db import models

class Book(models.Model):
  
  name = models.CharField(max_length=255)
  title = models.CharField(max_length=255)
  price = models.IntegerField()
  ...
  
class Category(models.Model):
  
  CATEGORY_CHOICES = (
    ('00', 'English'),
    ('01', 'Computer'),
  )
  
  book = models.ForeignKey(Book)
  category = models.CharField(max_length=255, choices=CATEGORY_CHOICES)
  remark = models.CharField(max_length=255)
  ...

admin.py 文件(以 category 为例)

# coding: utf8
from django.contrib import admin
from django import forms

from .models import Category

class CategoryAdmin(admin.ModelAdmin):

  search_fileds = ('book__name', 'book__title', 'book__price', 'category') # 设置搜索栏范围,如果有外键,要注明外键的哪个字段,双下划线
  list_display = ('book', 'category') # 在页面上显示的字段,若不设置则显示 models.py 中 __unicode__(self) 中所返回的值
  list_display_links = ('category') # 设置页面上哪个字段可单击进入详细页面
  fields = ('category', 'book') # 设置添加/修改详细信息时,哪些字段显示,在这里 remark 字段将不显示
  
admin.site.register(Category, CategoryAdmin)

[ 说明 ]

在使用 Django admin 系统中的搜索时可能会出现“related Field has invalid lookup: icontains”错误,主要原因是外键查询是需要指定相应的字段的。

外键不应该只是一个model,而该是另一个表的明确的一个字段。

所以我们需要指定特定的字段 "本表外键字段__外键所在表需查询字段"。

补充知识:Django的model中使用外键,但在页面上显示的是xxx_object?

在Django中定义了如下A,B两个模型:

class A:
   name=models.CharField(max_length=15)
   def __unicode__(self):
       return self.name
 
class B:
   name=models.CharField(max_length=15)
   f=models.ForeignKey(A,on_delete=models.DO_NOTHING)
 
   def __unicode__(self):
      return self.name

注:我在测试环境中使用的是python2.7,一切操作做完之后,部署到云服务器上后,就在后台管理系统中看到B的属性一栏中f显示为A_Object,并没有显示A的属性——name的值。

究其缘由,发现我的云服务器上用的是python3.6,在这里要将__unicode__()方法替换成__str__()方法才行.

class A:
   name=models.CharField(max_length=15)
   def __str__(self):
       return self.name
 
class B:
   name=models.CharField(max_length=15)
   f=models.ForeignKey(A,on_delete=models.DO_NOTHING)
 
   def __str__(self):
      return self.name

当然,如果使用的版本是python3.x,为了更好地兼容python2.x,可以使用@python_2_unicode_compatible装饰器来使python2.x想python3.x一样处理Unicode字符。

from django.utils.encoding import python_2_unicode_compatible
 
@python_2_unicode_compatible
class A:
   name=models.CharField(max_length=15)
   def __str__(self):
       return self.name
 
@python_2_unicode_compatible
class B:
   name=models.CharField(max_length=15)
   f=models.ForeignKey(A,on_delete=models.DO_NOTHING)
 
   def __str__(self):
      return self.name

以上这篇在django admin中配置搜索域是一个外键时的处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python加pyGame实现的简单拼图游戏实例
May 15 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
对python中的logger模块全面讲解
Apr 28 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
python Tensor和Array对比分析
Jan 08 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
python之语音识别speech模块
Sep 09 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
聊聊Python String型列表求最值的问题
Jan 18 Python
python中 Flask Web 表单的使用方法
May 20 Python
Python使用Paramiko控制liunx第三方库
May 20 #Python
解决django框架model中外键不落实到数据库问题
May 20 #Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 #Python
让Django的BooleanField支持字符串形式的输入方式
May 20 #Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 #Python
基于Python脚本实现邮件报警功能
May 20 #Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 #Python
You might like
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python3 map函数和filter函数详解
2019/08/26 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
如何清空python的变量
2020/07/05 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
儿童生日会策划方案
2014/05/15 职场文书
投标承诺函范文
2015/01/21 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python