【问题标题】:How to convert django ManyToManyField into Django-nonrel Field?如何将 django ManyToManyField 转换为 Django-nonrel 字段?
【发布时间】:2012-12-10 18:19:37
【问题描述】:

我在django中构建了一个应用程序,但是因为我发现google app engine不支持开箱即用的Django(免费,云sql不能免费使用吧?)。

我决定迁移到 Django-nonrel,所以需要转换的数据库字段很少,我不知道如何:

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')

分类模型由管理员创建,UserProfile 可以有多个分类,同一个分类可以属于多个用户,与产品相同。

请帮助构建这些模型,也许还有一些关于如何使用 Django-nonrel 的提示

我对数据库真的很陌生

【问题讨论】:

    标签: django google-app-engine many-to-many django-nonrel


    【解决方案1】:

    有两种方法可以做到这一点。更便宜的版本是使用 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)
    

    在这种情况下,您需要为每个关系创建一个新实体,并在获取您实际想要使用的实际 Cate 或 UserProfile 实体之前查询 UserCateMapping 实体。这将比第一个选项更昂贵,但您将拥有无限的映射。

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 1970-01-01
      • 2011-07-24
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2014-03-19
      相关资源
      最近更新 更多