2

我在 django 中构建了一个应用程序,但是因为我发现 google 应用程序引擎不支持开箱即用的 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')

Cate 模型由管理员创建,UserProfile 可以有多个 cate,同一个 cate 可以属于多个用户,与 product 相同。

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

我对数据库真的很陌生

4

1 回答 1

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)

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

于 2012-12-25T15:50:11.920 回答