2014-03-12 44 views
0

我想弄清楚我要如何'CRUD'项目的顺序,我在一个组中存储在数据库中。 (伪声明:选择*应用程序中的项目,其中group_id = 1;)跟踪项目顺序存储和从数据库检索

我的猜测是,我只是使用数字字段,随着更多项目添加到组中或从中删除,我只是增加/减少数字。我可以随时更新此字段中的物品编号,因为它们都是移动的。不过,我已经看到了这个真的走在旧的遗留应用程序严重错误,其中的项目将获得不同步的,你就会有一个群里的顺序弄成这个样子的东西:

0,1,1,3,4,5 
0,1,1,1,4,5 

这不是由应用程序非常优雅地处理,并且破坏了需要手动干预的应用程序来重新排序数据库中的项目。

有没有办法避免这个陷阱?

编辑:我也可能想要多个订单的多个组中可用的项目。 我认为在这种情况下,我需要一个多对多的关系,用于组对物品关系和物品到订购的关系。 /编辑

我会在Django框架中这样做。

回答

0

我不太确定你在问什么;因为排序是一回事,而相关对象的分组完全是另一回事。

数据库不存储事物的顺序,而是存储事物的关系(分组)。事物的顺序是用户界面的细节,而不是数据库应该使用的东西。

在django中,您可以创建ManyToMany关系。这基本上创建了一个“框”,您可以在其中添加和删除与特定模型相关的项目。下面是从documentation的例子:

from django.db import models 

class Publication(models.Model): 
    title = models.CharField(max_length=30) 

    # On Python 3: def __str__(self): 
    def __unicode__(self): 
     return self.title 

    class Meta: 
     ordering = ('title',) 

class Article(models.Model): 
    headline = models.CharField(max_length=100) 
    publications = models.ManyToManyField(Publication) 

    # On Python 3: def __str__(self): 
    def __unicode__(self): 
     return self.headline 

    class Meta: 
     ordering = ('headline',) 

下面的文章可以属于多个刊物和出版物都与他们相关联的一个或更多文章:

a = Article.create(headline='Hello') 
b = Article.create(headline='World') 
p = Publication.create(title='My Publication') 

p.article_set.add(a) 
p.article_set.add(b) 
p.save() 

# You can also add an article to a publication from the article object: 

c = Article.create(headline='The Answer is 42') 
c.publications.add(p) 

知道有多少文章属于出版物:

Publication.objects.get(title='My Publication').article_set.count() 
+0

对不起,我猜这在我的脑海里是不清楚的,这就是为什么我在努力写作中苦苦挣扎。 我想存储订单状态,以便为用户提供特定的物品订单(与日期,字母字段或物品ID无关)。复杂的因素是将物品放在多个组中。 – richardnpaul

+0

假设您的文章标题为'您好' '至' '我们的' '好友',并且您希望每次都按顺序显示它们。 ID分别为2,4,3,1,添加的日期将跟随ID。你不能通过id,datetime或按字母顺序排列它们,但是你希望你的访问者在输出'Publication.objects.get(title ='My Publication')时看到原来的顺序。article_set.all()'而不是'朋友','你好','我们','到'。在模板中,您需要使用某些功能将演示文稿订购给最终用户,而无需按照您的首选顺序手动输出每个项目的ID。 – richardnpaul

相关问题