我想在Django中创建一个存储数据的模型,其中包含1)总线服务的名称2)源3)目的地4)trip_distance和5)entry_timestamp。Django中的同一张表中的多重Foriegn键?
我还想将服务,源和目标的名称保存在单独的数据库表中。所以用户可以在填写表单时从下拉菜单中选择这些。
class Service(models.Model):
service_name = models.CharField(max_length = 30)
entry_timestamp = models.DateTimeField(auto_now_add = True)
def __unicode__(self):
return self.service_name
class Source(models.Model):
source_name = models.CharField(max_length = 30)
entry_timestamp = models.DateTimeField(auto_now_add = True)
def __unicode__(self):
return self.source_name
class Destination(models.Model):
destination_name = models.CharField(max_length = 30)
entry_timestamp = models.DateTimeField(auto_now_add = True)
def __unicode__(self):
return self.destination_name
class EntryForm(models.Model):
service= models.ForeignKey(Service)
source = models.ForeignKey(Source)
destination = models.ForeignKey(Destination)
trip_distance = models.PositiveIntegerField()
entry_timestamp = models.DateTimeField(auto_now_add = True)
class GlobalOption(models.Model):
config_option = models.CharField(max_length=30)
value = models.CharField(max_length = 30)
这是我想出来的。
现在,当我试图通过壳创建EntryForm,我收到以下错误
q = Service.objects.get(pk=1)
>>> q
<Service: Rajasthan Roadways>
q.entryform_set.create(source = 'Midwest',destination = 'Sahara',trip_distance = 10000)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 752, in create
return super(RelatedManager, self.db_manager(db)).create(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 346, in create
obj = self.model(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 468, in __init__
setattr(self, field.name, rel_obj)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 635, in __set__
self.field.rel.to._meta.object_name,
ValueError: Cannot assign "'Midwest'": "EntryForm.source" must be a "Source" instance.
我该怎么设计这个更好?我可以通过管理员手动创建EntryForm对象,然后工作。
在本教程的Django类似的线工作,并没有给这个错误
>>> q = Question.objects.get(pk=1)
# Display any choices from the related object set -- none so far.
>>> q.choice_set.all()
[]
# Create three choices.
>>> q.choice_set.create(choice_text='Not much', votes=0)
为什么我不能同样创建EntryForm对象?此外,我想要一个表格来保存数据到这个模型,所以我可以命名它?
如何解决_what_? 'source'字段是'ForeignKey'。由于错误状态,您不能分配诸如“Midwest”之类的字符串。它必须是一个'Source'对象。您可以首先创建一个Source对象,然后将其用作EntryForm.source的值。顺便说一句,命名模型'EntryForm'是非常令人困惑的,因为它不是一种形式。 – Selcuk
是的,但最好将模型命名为'Entry',并为实际的Django'Form'类保留名称EntryForm。 – Selcuk
我如何更好地设计这些模型?模拟这个问题的最佳方式是什么?在这个问题中,我有一张表格作为条目,其他表格还有其他表格,用于来源和目的地等等。 –