在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基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
浅谈python中的占位符
Nov 09 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
python DataFrame 取差集实例
Jan 30 Python
Django中的cookie和session
Aug 27 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python原始套接字编程实例解析
Jan 29 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
python判断是空的实例分享
Jul 06 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 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
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
javascript 闭包疑问
2010/12/30 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
Vue自定义属性实例分析
2019/02/23 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
vue中touch和click共存的解决方式
2020/07/28 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
Python 正则表达式操作指南
2009/05/04 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
生产经理的自我评价分享
2013/11/07 职场文书
一年级评语大全
2014/04/23 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js
Java 数组的使用
2022/05/11 Java/Android