Python Django MultipleObject在使用旧数据库时返回

Python Django MultipleObject在使用旧数据库时返回,python,django,django-models,django-views,legacy-database,Python,Django,Django Models,Django Views,Legacy Database,我正在使用Djano开发一个简单的web应用程序来显示和管理数据库数据。我连接了一个MySQL数据库,并使用inspectdb根据数据库表自动生成一个模型,这就是我得到的结果,看起来不错 # This is an auto-generated Django model module. # You'll have to do the following manually to clean this up: # * Rearrange models' order # * Make sure

我正在使用Djano开发一个简单的web应用程序来显示和管理数据库数据。我连接了一个MySQL数据库,并使用inspectdb根据数据库表自动生成一个模型,这就是我得到的结果,看起来不错

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from __future__ import unicode_literals
from django.core.exceptions import MultipleObjectsReturned
from django.db import models


class Booking(models.Model):

    class Meta:
        managed = False
        db_table = 'Booking'
        unique_together = (('hotelno', 'guestno', 'datefrom'),)

    hotelno = models.OneToOneField('Hotel', models.DO_NOTHING, db_column='hotelNo', primary_key=True)  # Field name made lowercase.
    guestno = models.IntegerField(db_column='guestNo')  # Field name made lowercase.
    datefrom = models.DateTimeField(db_column='dateFrom')  # Field name made lowercase.
    dateto = models.DateTimeField(db_column='dateTo', blank=True, null=True)  # Field name made lowercase.
    roomno = models.OneToOneField('Room', models.DO_NOTHING, db_column='roomNo')  # Field name made lowercase.

    list_display = 
    #def __str__(self):
     #   return ("".join(hotelno) + "".join(guestno) + "".join(datefrom))

class Guest(models.Model):
    guestno = models.AutoField(db_column='guestNo', primary_key=True)  # Field name made lowercase.
    guestname = models.CharField(db_column='guestName', max_length=255)  # Field name made lowercase.
    guestaddress = models.CharField(db_column='guestAddress', max_length=255, blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Guest'


class Hotel(models.Model):
    hotelno = models.AutoField(db_column='hotelNo', primary_key=True)  # Field name made lowercase.
    hotelname = models.CharField(db_column='hotelName', max_length=255, blank=True, null=True)  # Field name made lowercase.
    city = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Hotel'


class Room(models.Model):
    roomno = models.IntegerField(db_column='roomNo', primary_key=True)  # Field name made lowercase.
    hotelno = models.ForeignKey(Hotel, models.DO_NOTHING, db_column='hotelNo')  # Field name made lowercase.
    type = models.CharField(max_length=255, blank=True, null=True)
    price = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Room'
        unique_together = (('roomno', 'hotelno'),)
在这个应用程序的admin.py文件中,我包括了这样的模型,这样我至少可以看到上面的数据

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin

# Register your models here.

from .models import Hotel, Room, Guest, Booking

admin.site.register(Hotel)
admin.site.register(Room)
admin.site.register(Guest)
admin.site.register(Booking)
当我访问默认的Django管理页面时,我将看到 我点击Bookings并看到,没有名字(出于其他原因),但如果我点击其中一个,我会看到


我已经阅读了所有我能找到的东西,我能找到的最接近为什么会发生这种情况的原因与某些模型中存在复合键有关。但是,再一次,我不知道这是否是真正的原因,我也可能遗漏了什么?我不知道。

我想原因是
预订表的数据与您的车型声明不一致。Django的管理细节视图按主键检索模型

您将
hotelno
标记为主键:

hotelno = models.OneToOneField('Hotel', models.DO_NOTHING, db_column='hotelNo', primary_key=True)

由于
Booking
表中已经存在一些数据,您必须确保
hotelno
值(hotelno列)是唯一的,否则您将得到
multipleobjects返回的
非唯一pk值例外。另外,请确保您已经阅读了文档的这一部分

您的预订表似乎没有主键,并且在将其影响到预订表的hotelno列时,inspectdb猜错了

当管理员试图通过id获取记录时,会得到多个结果,因为不同的预订可以多次引用同一酒店

我将在预订模式上做什么:

  • 将hotelno和roomno更改为ForeignKey
  • 卸下hotelno上的主电源

新的问题是,现在您有一个没有主键的模型。Django不允许这样。如果您可以更改MySQL表,请向其添加一个主键列,并相应地更改预订模型。如果您不能更改该表,我认为没有简单的方法使其工作。

我完全可以根据需要更改数据库。我刚刚接触Django,所以我不确定什么会起作用。让我试试这个,我会给你回复的。