在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 相关文章推荐
以windows service方式运行Python程序的方法
Jun 03 Python
详解Python中的Cookie模块使用
Jul 06 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
Python 实现一行输入多个值的方法
Apr 21 Python
详解python中的装饰器
Jul 10 Python
Python面向对象程序设计示例小结
Jan 30 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
Django REST framework内置路由用法
Jul 26 Python
自定义django admin model表单提交的例子
Aug 23 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
yii分页组件用法实例分析
2015/12/28 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
详解python播放音频的三种方法
2019/09/23 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
python getopt模块使用实例解析
2019/12/18 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
高中军训感想800字
2014/02/23 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
优秀员工事迹材料
2014/12/20 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
Github 使用python对copilot做些简单使用测试
2022/04/14 Python