在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 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
Python3之简单搭建自带服务器的实例讲解
Jun 04 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
python调用摄像头拍摄数据集
Jun 01 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
tensorflow自定义激活函数实例
Feb 04 Python
Django实现前台上传并显示图片功能
May 29 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
Python数据模型与Python对象模型的相关总结
Jan 26 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
Discuz! Passport 通行证整合
2008/03/27 PHP
使用php清除bom示例
2014/03/03 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
举例详解Python中的split()函数的使用方法
2015/04/07 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python数据库小程序源代码
2019/09/15 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
产品调价通知函
2015/04/20 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
遗失证明范文
2015/06/19 职场文书
公司保洁员管理制度
2015/08/04 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
创业计划书之酒吧
2019/12/02 职场文书
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python