【问题标题】:Django Python - How to add foreign key to table displayed in admin pageDjango Python - 如何将外键添加到管理页面中显示的表中
【发布时间】:2017-09-01 05:54:12
【问题描述】:

所以我在 MySQL 数据库中有 4 个表。 该数据库是在我使用 Django 创建的应用程序下使用 Django 管理的。 下面是models.py文件中4个类中的2个,对应于数据库表:

from __future__ import unicode_literals

from django.db import models

class Pdb(models.Model):
    id_pdb_chain = models.CharField(db_column='id_PDB_chain', primary_key=True, max_length=5)  # Field name made lowercase.
    id_pdb = models.CharField(db_column='id_PDB', max_length=4)  # Field name made lowercase.
    chaine = models.CharField(max_length=10)
    header = models.CharField(max_length=255)
    sequence_proteine = models.TextField(db_column='sequence_Proteine')  # Field name made lowercase.
    start_seq = models.IntegerField()
    taille_proteine = models.IntegerField(db_column='taille_Proteine')  # Field name made lowercase.
    resolution_pdb = models.FloatField(db_column='resolution_PDB')  # Field name made lowercase.
    meth_res = models.ForeignKey('MethodesRes', models.DO_NOTHING, db_column='meth_Res')  # Field name made lowercase.

    def __unicode__(self):
        return self.id_pdb

    class Meta:
        managed = False
        db_table = 'PDB'

class StructSec(models.Model):
    id_struct_sec = models.AutoField(primary_key=True)
    start_pred = models.IntegerField()
    structure_predite = models.TextField(db_column='structure_Predite')  # Field name made lowercase.
    nombre_ppii = models.IntegerField(db_column='nombre_PPII')  # Field name made lowercase.
    pourcentage_ppii = models.FloatField(db_column='pourcentage_PPII')  # Field name made lowercase.
    angle_phi = models.TextField()
    angle_psi = models.TextField()
    id_pdb_chain = models.ForeignKey(Pdb, models.DO_NOTHING, db_column='id_PDB_chain')  # Field name made lowercase.
    nom_analyse = models.ForeignKey(MethodesAnalyse, models.DO_NOTHING, db_column='nom_Analyse')  # Field name made lowercase.

    def __unicode__(self):
        return self.structure_predite

    class Meta:
        managed = False
        db_table = 'struct_sec'

如您所见,我已经找到了一种在管理页面中为每个表显示字段的方法,每个表中都有此部分:

def __unicode__(self):
    return self.structure_predite

但是当我想用“StructSec”类中的主键替换“structure_predite”时,如下所示:

def __unicode__(self):
    return self.id_struct_sec

Django 返回此错误:

TypeError: coercing to Unicode: need string or buffer, long found

我还必须提到,我在“admin.py”文件中做了一些修改:

from django.contrib import admin

from .models import Pdb, MethodesAnalyse, MethodesRes, StructSec


class PdbInline(admin.TabularInline):
    model = Pdb

class PdbAdmin(admin.ModelAdmin):
    list_display = ('id_pdb','header','chaine','taille_proteine','meth_res')
    list_filter = ['chaine','meth_res']
    search_fields = ['id_pdb_chain','header']


class MethodesAnalyseInline(admin.TabularInline):
    model = MethodesAnalyse

class MethodesAnalyseAdmin(admin.ModelAdmin):
    list_display = ('nom_analyse')


class MethodesResInline(admin.TabularInline):
    model = MethodesRes

class MethodesResAdmin(admin.ModelAdmin):
    list_display = ('meth_res')


class StructSecInline(admin.TabularInline):
    model = MethodesRes

class StructSecAdmin(admin.ModelAdmin):
    list_display = ('id_struct_sec','nombre_PPII','pourcentage_PPII','id_PDB','nom_Analyse')
    search_fields = ['nombre_ppii','pourcentage_ppii']


admin.site.register(Pdb,PdbAdmin)
admin.site.register(MethodesAnalyse)
admin.site.register(MethodesRes)
admin.site.register(StructSec)

知道了这一点,我的问题很简单: 如何在对应的管理表中正确显示StructSec类的自增ID(主键)?

【问题讨论】:

    标签: python mysql django django-admin auto-increment


    【解决方案1】:

    我认为错误是由于 None 值而引起的。 Python 无法转换 None。

    将您的 unicode 定义替换为 'str' 为:

     def __str__(self):
          return self.id_struct_sec
    

    【讨论】:

    • 答案是正确的,我只是补充一点,要使链接正常工作,您还必须这样做:def __str__(self): return self.id_struct_sec
    • 太棒了。我没试过。但是,是的 str() 会给你正确的结果。
    【解决方案2】:

    Sijan 的回答是正确的,我只是补充一点,要使链接正常工作,您可能还必须这样做:

     def __str__(self):
          return str(self.id_struct_sec)
    

    如果返回中没有“str()”,则链接将不起作用并在单击时返回错误。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2013-07-12
      相关资源
      最近更新 更多