2017-12-01 2 views
1

Djano를 사용하여 데이터베이스 데이터를 표시하고 관리하는 간단한 웹 응용 프로그램을 개발하고 있습니다. 나는 MySQL 데이터베이스를 연결하고 inspectdb를 사용하여 자동으로 데이터베이스 테이블을 기반으로 모델을 생성했다.Django MultipleObjects 기존 데이터베이스를 사용하는 동안 반환

# 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) 

내가 기본 장고 관리자 페이지에 액세스 할 때 내가 얻을 그들 중 하나를 클릭하면, 나는 tables registered on admin page. 내가 (다른 이유로) 이름없이 예약을 클릭하고 multiple records를 참조 볼 수 있지만거야 the MultipleObjectsReturned Error

내가 찾을 수있는 모든 것을 읽었으며 가장 가까운 것은 내가 왜 이런 일이 일어나고 있는지를 알 수있는 이유 중 일부는 모델의 복합 키와 관련이있다. 그러나 다시, 나는 그것이 실제 이유인지, 나는 또한 뭔가를 놓칠 수 있을지 모르겠다? 나는 모른다.

답변

1

나는 Booking 테이블의 데이터가 모델 선언과 일치하지 않는다고 생각합니다. Django의 관리자 상세보기는 기본 키로 모델을 검색합니다.

당신은 PK로 hotelno 표시 :

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

일부 데이터가 이미 Booking 테이블에 존재하기 때문에를, 당신은 hotelno 값 (hotelNo 열)이 고유한지 확인해야하거나 고유하지 않은 대한 MultipleObjectsReturned 예외를 얻을 것이다 pk 값. 또한 설명서의이 부분을 읽었는지 확인하십시오. https://docs.djangoproject.com/en/1.11/ref/models/options/#managed

0

예약 테이블의 hotelno 열에 영향을 줄 때 예약 테이블에 기본 키가없고 inspectdb가 잘못 판단 된 것 같습니다.

관리자가 ID로 레코드를 가져 오려고하면 다른 예약이 동일한 호텔을 여러 번 참조 할 수 있으므로 여러 결과가 표시됩니다.

내가 예약 모델에 어떻게 할 것인지 : 새로운 문제는 지금 당신이 더있는 모델이 제거에게 외래 키

    • 변경 hotelno 및 roomno hotelno

    의 기본을 기본 키. 장고는 그것을 허용하지 않습니다. MySQL 테이블을 변경할 수있는 경우 기본 키 열을 추가하고 이에 따라 예약 모델을 변경하십시오. 테이블을 변경할 수 없다면 쉽게 작동하는 방법이 없습니다.

  • +0

    필요에 따라 데이터베이스를 확실히 변경할 수 있습니다. 나는 장고를 처음 사용하기 때문에 어떤 것이 효과가 있을지 확신 할 수 없었다. 이걸 시험해 볼게요. 그리고 제가 다시 연락 할게요. –

    관련 문제