2014-10-22 43 views
0

我正在处理一些“遗留”代码并处理一个问题。我有一些MySQL的架构,其中两个表(这是简化得多的东西去这里):如何从一张表映射到django模型?

article 
+------+-------------+-------+------+ 
| id | author  | title | year | 
+------+-------------+-------+------+ 
| 1 | author_name | title | 1999 | 
+------+-------------+-------+------+ 

article_pages 
+------+------------+----------+ 
| id | pages_from | pages_to | 
+------+------------+----------+ 
| 1 |   10 |  15 | 
+------+------------+----------+ 

的文章和article_pages Django的模型,看起来很明显:

class Article(models.Model): 
    id = models.IntegerField() 
    author = models.CharField(max_length=256) 
    name = models.CharField(max_length = 256) 
    year = models.IntegerField() 

class ArticlePages(models.Model): 
    id = models.IntegerField() 
    page_from = models.IntegerField() 
    page_to = models.IntegerField() 

现在在我views我需要通过网页的排序articels:

articles = Article.objects.filter(name=current_name_to_filter).order_by('page_from')

我知道,需要有OneToOneFiledArticleArticlePages之间的关系,但我不太清楚如何实现。我想:pages_from = OneToOneField(ArticlePages.page_from, related_name = 'id')。我非常了解python,但我是Django的新手。这种方法在我看来很明显,但不起作用。我知道需要对数据库进行一些更改,但调用python manange.py syncdb不起作用。 两个表中的id列是它们之间的标识符。 idarticlearticle_pages对应在一起。

我需要使用:mysqldjangon=1.5.2

+0

您是否使用['inspectdb'](https://docs.djangoproject.com/en/1.7/howto/legacy-databases/#auto-generate-the-models)来创建这些模型? – 2014-10-22 06:22:16

+0

另外还有答案。 'Django south'''(http://south.readthedocs.org/en/latest/)是管理数据库变更的好工具。 – 2014-10-22 10:42:09

回答

0

您需要使用ForeignKey指向模型,OneToOneField ForeignKey的是与unique=True约束。但是你试图指向确切的id(这是整数)。但是,这不是如何在SQL中工作(当然在mysql)。

需要什么样的:

  1. 删除明确定义id场。您的模型全部都有primary key整数字段,名称为“id”。如果没有定义其他主键字段,将会创建这样的字段automatically by django

  2. 当使用OneToOneField时,指向您正在引用的模型类。

最终结果:

class Article(models.Model): 
    author = models.CharField(max_length=256) 
    name = models.CharField(max_length = 256) 
    year = models.IntegerField() 

class ArticlePages(models.Model): 
    page_from = models.OneToOneField(Article) 
    page_to = models.OneToOneField(Article) 
+0

嗯......你是说我需要重新定义mysql和模型吗?我不确定我是否做了某种'id'操作,其他东西不会被破坏。 – advena 2014-10-22 17:55:39

+0

不要修改mysql中的表,只更新django模型 – stalk 2014-10-22 18:26:27

+0

仍然没有得到它可能如何工作...我已经做出了你已经建议的更改,但仍然'syncbd'没有提供任何东西。当我到达shell时,会引发'DatabaseError'。 我想知道你的方法'views'对象会如何“知道”'Article'可以通过存储在'ArticlePages'表中的页面进行排序。 – advena 2014-10-22 20:02:38

0

根据数据表,你显示,目前尚不清楚什么是识别这两个表之间的关系的列。如果这是真实的情况,我只能猜测id列是一个(表articlearticle_pages共享相同的ID,这将意味着具有特定id的文章对应于具有相同id的article_pages中的行)。

这不应该是Django ORM的情况(至少,我不知道这种数据库结构是可能的)。如果您遇到该数据库结构,请尝试直接运行SQL查询(https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly):

请检查表结构,并在问题还有更多时更新问题。也许一些文章的容器表(如书/出版物)。

+0

我做了更新'id'就是这里的标识符。是的,结构有点不同,但这个想法是这样的。我想尽可能简单地解释问题。 – advena 2014-10-22 08:54:02

+0

我从来没有尝试过以下内容,但是如果您有时间,请尝试发送结果: – 2014-10-23 09:30:04

+0

(对不起,有两条评论 - 点击中间输入) 添加属性'article = models.OneToOneField(Article,db_column ='id',related_name ='article_page'')在ArticlePages类中(从来没有试图为多个Django ORM属性使用相同的数据库列)。 如果可行,请在查询的行中使用'.order_by('article_page__page_from')'。 – 2014-10-23 09:37:39