Django的。如何从另一个模型中选择模型

时间:2018-03-21 09:14:26

标签: python django web

我正在尝试为我的模型进行迁移:

from django.db import models  
TAKEN = (
    (True, 'Yes'),
    (False, 'No')
)  

class Room(models.Model):
    name = models.CharField(max_length=32)
    number = models.IntegerField()
    taken = models.BooleanField(choices=TAKEN)
    description = models.CharField(max_length=128)

ROOMS_CHOICE = (Room.objects.filter(taken=False))

class Reservation(models.Model):
    date = models.DateField()
    hours = models.IntegerField()
    choice = models.OneToOneField(Room, on_delete=models.CASCADE, choices=ROOMS_CHOICE)

模型的表格:

from django import forms
from .models import TAKEN, ROOMS_CHOICE   
class NewRoomForm(forms.Form):
    name = forms.CharField(label='Name', max_length=32)
    number = forms.IntegerField(label='Room Number')
    taken = forms.ChoiceField(choices=TAKEN, label='Taken', widget=forms.Select)
    description = forms.CharField(label='Description', widget=forms.Textarea)   
class ReservationForm(forms.Form):
    date = forms.DateField(label='Date', widget=forms.SelectDateWidget)
    hours = forms.IntegerField(label='hours', max_value=8)
    choice = forms.ChoiceField(choices=ROOMS_CHOICE, label='room', widget=forms.Select)

当我尝试进行迁移时,会出现ProgrammingError:

django.db.utils.ProgrammingError: (1146, "Table 'conference_room.conference_room' doesn't exist")

我尝试制作一个视图,用户可以从可用房间预订会议室(未被占用的房间 - 拍摄=假)。我假设我在构建OneToOne关系和根据Room模型编写选择时犯了一些错误,这就是错误出现的原因。我怎样才能重写我的模型和表格?

1 个答案:

答案 0 :(得分:4)

这里确实存在许多问题。

导致您的问题的原因实际上不是您的OneToOneField,而是在ROOMS_CHOICE的定义中您正在模块级别进行查询 - 因此它将在模型文件首次导入时执行,在迁移之前执行有机会跑。这种事情需要在一个方法中完成,在这种情况下可能是表单的__init__(如果你需要它,你不会 - 见下文)。

然而,还有几个问题。首先,你不应该使用OneToOne;这意味着一个房间只能有一个预订,这显然不是这种情况。你需要一个ForeignKey,这是一对多的关系。

然后,你不应该在这里使用ChoiceField。 Django包含一个从模型中获取选择的字段:它叫做ModelChoiceField,它需要一个查询集:

choice = forms.ModelChoiceField(queryset=Room.objects.filter(taken=False), label='room', widget=forms.Select)

所以你实际上根本不需要定义ROOMS_CHOICE。

(我还指出,在Room上设置taken字段也没有意义;房间只在某个时间拍摄。你实际上需要查询房间那个不是在预订的日期/时间预订,在用户实际选择该日期之前您不能这样做。)