在django admin中配置搜索域是一个外键时的处理方法

作者:davidsu33 时间:2021-02-20 18:48:26 

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

来源:https://blog.csdn.net/davidsu33/article/details/51672163

标签:django,admin,搜索域,外键
0
投稿

猜你喜欢

  • 70+漂亮且极具亲和力的导航菜单设计推荐[译]

    2009-02-23 13:15:00
  • 利用matplotlib+numpy绘制多种绘图的方法实例

    2021-02-24 14:10:07
  • 解读HTML:命名空间与字符编码

    2008-12-10 14:03:00
  • mysql 队列 实现并发读

    2024-01-14 21:16:26
  • Python中shutil模块的学习笔记教程

    2022-12-22 20:42:05
  • python 将html转换为pdf的几种方法

    2023-03-30 11:50:11
  • 用Python制作简单的钢琴程序的教程

    2022-08-20 07:18:49
  • javascript实现简单的可随机变色网页计算器示例

    2024-04-16 09:37:07
  • 给Python学习者的文件读写指南(含基础与进阶)

    2021-04-26 12:05:40
  • asp如何通过表单创建一个Word?

    2010-06-07 20:56:00
  • python中scipy.stats产生随机数实例讲解

    2021-03-20 07:57:04
  • PHP使用flock实现文件加锁的方法

    2023-10-29 21:26:59
  • 提升Python程序性能的7个习惯

    2021-09-11 04:05:07
  • 基于Python实现五子棋-(人机对战)

    2022-07-04 06:23:48
  • Vue系列之Element UI表单自定义校验规则

    2024-04-30 08:41:17
  • Python pathlib模块实例详解

    2023-03-10 10:59:06
  • Mysql安装 Navicat 出现1044/1045错误的解决方法

    2024-01-15 18:13:30
  • Pandas实现自定义Excel格式并导出多个sheet表

    2022-10-04 18:46:34
  • 浅谈图像处理中掩膜(mask)的意义

    2021-03-17 01:48:50
  • 使用Python做定时任务及时了解互联网动态

    2021-07-08 17:54:16
  • asp之家 网络编程 m.aspxhome.com