在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从ftp下载数据保存实例
Nov 20 Python
python实现ipsec开权限实例
Nov 11 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
Python闭包执行时值的传递方式实例分析
Jun 04 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
Django如何实现防止XSS攻击
Oct 13 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
python实现局部图像放大
Nov 17 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 mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
Pycharm远程调试openstack的方法
2017/11/21 Python
python 正确保留多位小数的实例
2018/07/16 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
中专生的个人自我评价
2013/12/11 职场文书
活动总结报告范文
2014/05/04 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
六年级小学生评语
2014/12/26 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
MySQL 语句执行顺序举例解析
2022/06/05 MySQL