在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从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
python list转矩阵的实例讲解
Aug 04 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
python requests证书问题解决
Sep 05 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
python3 实现调用串口功能
Dec 26 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
Django实现翻页的示例代码
May 24 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
mysql时区问题
2008/03/26 PHP
php 面向对象的一个例子
2011/04/12 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
python机器学习之神经网络实现
2018/10/13 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
python interpolate插值实例
2020/07/06 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
校园歌手大赛策划书
2014/01/17 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python