2016-05-14 21 views
0

我想在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对象?此外,我想要一个表格来保存数据到这个模型,所以我可以命名它?

+0

如何解决_what_? 'source'字段是'ForeignKey'。由于错误状态,您不能分配诸如“Midwest”之类的字符串。它必须是一个'Source'对象。您可以首先创建一个Source对象,然后将其用作EntryForm.source的值。顺便说一句,命名模型'EntryForm'是非常令人困惑的,因为它不是一种形式。 – Selcuk

+0

是的,但最好将模型命名为'Entry',并为实际的Django'Form'类保留名称EntryForm。 – Selcuk

+0

我如何更好地设计这些模型?模拟这个问题的最佳方式是什么?在这个问题中,我有一张表格作为条目,其他表格还有其他表格,用于来源和目的地等等。 –

回答

0

在评论中,您正在询问如何设置模型。您可以将SourceDestination分组到一个模型中,将其称为Place,因为它们似乎都是指地点。

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 Place(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 Connection(models.Model): 
    service= models.ForeignKey(Service, related_name='connections') 
    source = models.ForeignKey(Place, related_name='departing_connections') 
    destination = models.ForeignKey(Place, related_name='arriving_connections') 
    trip_distance = models.PositiveIntegerField() 
    entry_timestamp = models.DateTimeField(auto_now_add = True) 

只有你Connection模型,你再他们分成sourcedestination领域。添加related_name使得它更容易阅读,例如

p = Place.objects.get(pk=1) 

from_here = p.departing_connections.all() 

this_year = from_here.filter(service__entry_timestamp__year=date.today().year 

之前,你可以添加Connection S,你需要添加ServicePlace对象,连接涉及到。

+0

那很好。但是,对于我的使用,将永远不会有离开的连接和只到达的连接。所以我想为来源和目的地创建一个单独的表格,以便用户可以从较小的来源和目的地列表中进行选择。 –