在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的函数嵌套的使用方法
Jan 24 Python
Python中的jquery PyQuery库使用小结
May 13 Python
python处理html转义字符的方法详解
Jul 01 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python学生管理系统
Jan 30 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
pytorch模型存储的2种实现方法
Feb 14 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
Python爬取12306车次信息代码详解
Aug 12 Python
python使用yaml 管理selenium元素的示例
Dec 01 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
php下实现折线图效果的代码
2007/04/28 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
JS二分查找算法详解
2017/11/01 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
python常用数据重复项处理方法
2019/11/22 Python
python中pyplot基础图标函数整理
2020/11/10 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
大学军训通讯稿
2014/01/13 职场文书
店长职务说明书
2014/02/04 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
如何写观后感
2015/06/19 职场文书
新闻稿件写作范文
2015/07/18 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python