2

unique_togetherDjango の機能を真似ようとしていますが、うまくいきません。

class MyClass(ndb.Model):
    name = 'name'
    surname = 'surname'
    phone = 'phone'

    def get_unique_key(self):
        return self.name + "|" + self.surname + "|" + self.phone

「ええ、とても簡単です

この投稿で受け入れられた回答によるとid、obj コンストラクターでパラメーターを割り当てるだけで十分でした。しかし、私はそれをビューで処理したくありません。理想的には、私はこれを行います:

object = MyClass()
object = object.custom_populating_method(form.cleaned_data)
object.id = object.get_unique_key()
object.put()

または、それを に配置して、_pre_put_hook保存idする前に が最後に設定されるようにします (また、データストア全体でデータの一意性を強制するチェックを行うこともできます)。

どうやら、私は間違っていた。これを実現する唯一の方法は、ビューをハッキングすることです。

unique_id = "|" + form.cleaned_data['bla'] + "|" + form.cleaned_data ...
object = MyClass(id=unique_id)

これはひどく完全に間違っています (モデルの要件に対するすべての変更は、ビューでも検査する必要があるため)。さらに、関連するデータを取得するために、いくつかの醜い呼び出しを行うことになります。おそらく、この問題に時間を費やしすぎて出口を見つけることができませんでした。ここで明らかな何かが欠けていることを本当に願っていますが、この主題に関する良い例や適切なドキュメントを実際に見つけることができません。誰か似たようなヒントや経験がありますか?

tl;dr : ビューに不要なコードを追加せずにこれを実現する良い方法はありますか?

(私はデータストアでDjangoとndbのモデルを「使用しています」)

ありがとう

4

2 に答える 2

2

ファクトリまたはクラス メソッドを使用してインスタンスを構築します。

class MyClass(ndb.Model):
    name = ndb.StringProperty()
    surname = ndb.StringProperty()
    phone = ndb.StringProperty()

    @staticmethod
    def get_unique_key(name,surname,phone):
        return '|'.join((name,surname,phone))

    @classmethod
    @transactional
    def create_entity(cls,keyname,name,surname,phone):
        key = ndb.Key(cls, cls.get_uniquekey())
        ent = key.get()
        if ent:
             raise SomeDuplicateError() 
        else:
            ent = cls(key=key, name=name,surname=surname,phone=phone)
            ent.put()

newobj = MyClass.create_entity(somename, somesurname, somephone)

このようにすると、キーを作成して最初に取得しようとすることで、キーが一意であることを確認することもできます。

于 2013-07-18T03:25:11.200 に答える
0

keyだけでなく、全体を割り当てると、それができると思いますid:

object = MyClass()
object = object.custom_populating_method(form.cleaned_data)
object.key = ndb.Key(MyClass, object.get_unique_key())
object.put()
于 2013-07-17T17:34:40.973 に答える