在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中的with...as用法介绍
May 28 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
深入浅析python 中的匿名函数
May 21 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
python集合删除多种方法详解
Feb 10 Python
Python必须了解的35个关键词
Jul 16 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
Python深度学习之实现卷积神经网络
Jun 05 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下使用SMTP发邮件的代码
2008/01/10 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
PHP常用的小程序代码段
2015/11/14 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
Python中请使用isinstance()判断变量类型
2014/08/25 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
Python单元和文档测试实例详解
2019/04/11 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
计算机应用专业毕业生求职信
2013/10/24 职场文书
期末总结的个人自我评价
2013/11/02 职场文书
幼儿教师国培感言
2014/02/19 职场文书
销售会计岗位职责
2014/03/15 职场文书
刑事申诉状范文
2015/05/20 职场文书
无保留意见审计报告
2015/06/05 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL