在Django中设置相关对象的下拉列表

时间:2015-10-16 00:27:34

标签: python django django-rest-framework

我需要在我的事件模型中有一个下拉列表,以显示可用于绑定Django中事件的所有可能位置(使用DRF)。一个事件可以有很多位置,一个位置可以有很多事件。

不幸的是,当我在事件模型上使用queryset ModelChoiceField设置queryset=Location.objects.all()时,我遇到了问题,错误提示:

  

TypeError:调用元类库时出错       元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

我假设这是因为,在位置模型之后创建了事件模型时,目前还没有针对位置的数据。

那我在哪里可以定义这个下拉字段?

地点型号:

class Location(models.Model):
    location_name = models.CharField(max_length=200)
    ...

活动模型:

class Event(models.Model, forms.Form):
    event_name = models.CharField(max_length=200)
    location_id = models.IntegerField()
    locations = forms.ModelChoiceField(queryset=Location.objects.all().order_by('location_name'), null=True)

EventLocation加入:

class EventLocation(models.Model):
    event_id = models.ForeignKey(Event, blank=True, null=True)
    location_id = models.ForeignKey(Location, blank=True, null=True)

1 个答案:

答案 0 :(得分:0)

这里的问题是,当您声明Event模型时,您正在混合模型和表单:

class Event(models.Model, forms.Form):
    event_name = models.CharField(max_length=200)
    location_id = models.IntegerField()
    locations = forms.ModelChoiceField(queryset=Location.objects.all().order_by('location_name'), null=True)

除了您将locations声明为表单的字段而不是模型字段外。

为了解决这个问题,您必须以这种方式声明这两个模型:

from django.db import models

class Location(models.Model):
    location_name = models.CharField(max_length=200)

class Event(models.Model):
    event_name = models.CharField(max_length=200)
    location = models.ForeignKey(Location, null=True)

请注意,您不需要为Event和Location之间的关系声明中间模型(EventLocation)。只需将模型字段声明为外键,Django将为您创建它。

然后,如果你去了活动管理网站,你会发现可以从下拉输入中选择一个位置:

enter image description here