如何将Django ManyToManyField转换为Django-nonrel Field?

pay*_*ike 2 django google-app-engine many-to-many django-nonrel

我在django中构建了一个应用程序,但是因为我发现谷歌应用程序引擎不支持Django开箱即用(免费,云sql不能免费使用吗?).

我决定转移到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
Run Code Online (Sandbox Code Playgroud)

这是user_profile模型,它从用户模型扩展而来

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

     cates = models.ManyToManyField('shop.Cate')
Run Code Online (Sandbox Code Playgroud)

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

请帮助构建这些模型,并提供一些关于如何使用Django-nonrel的技巧

我是数据库新手

dra*_*onx 6

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

from djangotoolbox.fields import ListField

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    cates = ListField(models.ForeignKey(shop.Cate))
Run Code Online (Sandbox Code Playgroud)

ListField只存储一个Cate id列表.这有一些重要的限制.

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

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

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

class UserCateMapping(models.Model)
    user = models.ForeignKey(UserProfile)
    cate = models.ForeignKey(Cate)
Run Code Online (Sandbox Code Playgroud)

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