2012-12-24 34 views
2

我在django中构建了一个应用程序,但是由于我发现Google应用程序引擎不支持Django开箱即用(免费,云计算的sql不能用于免费的权利?)。如何将django ManyToManyField转换为Django-nonrel字段?

我决定搬到Django的nonrel,所以有需要转换的几场DATEBASE,我不知道如何:

class Cate(models.Model): 
    name = models.CharField(max_length = 100) 
    description = models.TextField() 
    create_by = models.ForeignKey(User) 
    create_date = models.DateTimeField('cate created date') 

    def __unicode__(self): 
     return self.name 

class Product(models.Model): 
    product_name = models.CharField(max_length = 200) 
    owner = models.ForeignKey(User) 

    cate = models.ManyToManyField(Cate) 

    timestamp = models.DateTimeField('product added date') 
    view = models.IntegerField(default = 0) 

    def __unicode__(self): 
     return self.product_name 

这里是从用户模型扩展user_profile模型

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 

    cates = models.ManyToManyField('shop.Cate') 

Cate模型由admin创建,UserProfile可以有很多cates,并且同一个cate可以属于许多用户,与产品相同。

请帮助这些模型,也许对如何使用Django的nonrel

一些提示,我真的很新构造数据库

回答

6

有两种方法可以做到这一点。更便宜的版本是使用ListFields

from djangotoolbox.fields import ListField 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    cates = ListField(models.ForeignKey(shop.Cate)) 

ListField只是存储Cate ID列表。这有一些重要的限制。

  1. 您的实体被限制为1MB,因此这会限制列表中的实体数量。在这种情况下,它仍然是一个相当大的数字,特别是因为你的实体中没有其他东西。

  2. 如果对cates字段进行了索引,则可以对其进行数据存储查询。但是,每个实体都有5000个索引的限制。您将为用户属性使用一个,因此在这种情况下,您的cates列表将被限制为具有5000个条目。我以前没有碰到过,所以我不知道它会如何失败,我想你会在编写实体时遇到异常。

更昂贵的选择是使用中间映射实体。这为您创建/查询映射实体的额外开销提供了无限的关系。

class UserCateMapping(models.Model) 
    user = models.ForeignKey(UserProfile) 
    cate = models.ForeignKey(Cate) 

在这种情况下,你需要获取你真的想用实际凯特或用户配置实体之前创建的每个关系的UserCateMapping实体一个新的实体和查询。这将比第一个选项更昂贵,但是你会有无限的映射。

相关问题