我需要在我的事件模型中有一个下拉列表,以显示可用于绑定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)
答案 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将为您创建它。
然后,如果你去了活动管理网站,你会发现可以从下拉输入中选择一个位置: