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 は製品と同じように多数のユーザーに属することができます。

これらのモデルの構築を手伝ってください。また、Django-nonrel の使用方法に関するヒントも教えてください。

私はデータベースに本当に慣れていません

4

1 に答える 1

6

これを行うには 2 つの方法があります。安価なバージョンは ListFields を使用することです

from djangotoolbox.fields import ListField

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

ListField は単純に Cate ID のリストを格納します。これにはいくつかの重要な制限があります。

  1. エンティティは 1 MB に制限されているため、これによりリスト内のエンティティの数が制限されます。この場合、特にエンティティには他に何もないため、かなり大きな数になります。

  2. インデックスが作成されている場合は、cates フィールドに対して dataastore クエリを実行できます。ただし、各エンティティには 5000 個のインデックスの制限があります。ユーザー属性に 1 つ使用するため、この場合、cates リストのエントリ数は 5000 に制限されます。私はこれを以前にヒットしたことがないので、どのように失敗するかわかりません.エンティティを書くときに例外が発生すると思います.

より高価なオプションは、中間マッピング エンティティを使用することです。これにより、マッピング エンティティの作成/クエリの追加費用に対して無制限の関係が得られます。

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

この場合、関係ごとに新しいエンティティを作成し、実際に使用する実際の Cate または UserProfile エンティティを取得する前に UserCateMapping エンティティをクエリする必要があります。最初のオプションよりも費用がかかりますが、マッピングは無制限になります。

于 2012-12-25T15:50:11.920 に答える