2012-06-20 23 views
1

我GOOGLE上和,我只是似乎没有得到它。在Django基本关系(建立在传统的DB之上)

我如何重新在Django简单的连接查询?

在models.py(Fylker是县,Dagensrepresentanter是人)

class Fylker(models.Model): 
    id = models.CharField(max_length=6, primary_key=True) 
    navn = models.CharField(max_length=300) 
    def __unicode__(self): 
     return self.navn 
    class Meta: 
     db_table = u'fylker' 

class Dagensrepresentanter(models.Model): 
    id = models.CharField(max_length=33, primary_key=True) 
    etternavn = models.CharField(max_length=300, blank=True) 
    fornavn = models.CharField(max_length=300, blank=True) 
    fylke = models.ForeignKey(Fylker, db_column='id') 
    def __unicode__(self): 
     return u'%s %s' % (self.fornavn, self.etternavn) 
    class Meta: 
     ordering = ['etternavn'] # sette default ordering 
     db_table = u'dagensrepresentanter' 

由于模型是自动创建的Django的,我已经加入了ForeignKey的,并试图将它连接到县。 ID字段是从我试图集成到这个Django项目的数据库继承。

通过查询

Dagensrepresentanter.objects.all() 

我得到的所有的人,但没有自己的县城。 通过查询

Dagensrepresentanter.objects.all().select_related() 

我得到Dagensrepresentanter.id和Fylker.id联接,但我想泰德加入到上Fylke的,又名

SELECT * FROM dagensrepresentanter d , fylker f WHERE d.fylke = f.id 

这样我能得到县名(Fylke navn)与所有人都有相同的结果集。

附加请求: 我已经阅读了django文档和相当多的问题,这里在stackoverflow,但我似乎无法得到我的头围绕这个ORM的东西。这是受到质疑的问题。你有什么好的资源(相关博客文章与经验/解释等)人们习惯认为的数据库为SQL-的事情,需要开始在Django ORM思维?

+0

您是否使用过['./manage.py inspectdb'](https://docs.djangoproject.com/en/dev/ref/django-admin/#inspectdb)? - 它可以帮助你处理遗留数据库。 – Tadeck

+0

./manage.py inspectdb显示我的models.py文件的起点。 e.g的'Fylke的= models.ForeignKey(Fylker,db_column = 'ID')从我的当前models.py'表示为'Fylke的= models.CharField(MAX_LENGTH = 6,空白=真)'。我从中学到了什么?那Django没有注意到我改变了models.py?要么? – Eiriks

+0

@Eriks:你真的想达到什么目的?你希望你的数据库能够遵循模型的变化吗?使用南。你想要基于你在数据库中拥有的模型吗?使用'inspectdb'。你是否想根据模型从头创建数据库?定义模型并使用'syncdb'。我不知道问题在哪里。如果你想学习ORM,有很多教程,ORM只是数据库顶层的一个抽象层(Object-Relational Mapper是相当具有描述性的名字)。 – Tadeck

回答

0

你的遗留数据库可能没有外键约束(例如,如果使用的MyISAM然后外键甚至不支持)。

你有两个选择:

  1. 添加外键约束,以你的表(将涉及升级到InnoDB的,如果你在MyISAM数据)。然后再次运行./manage inspectdb,关系应该出现。
  2. 使用表作为是(即,它们之间没有明确的关系)和在对象级别或通过编写自己的SQL查询手动(例如,Mytable.objects.get(other_table_id = 23))任一组成的查询。无论哪种方式,你都失去了Python的ORM查询语言的许多好处。
相关问题