0

ユーザー定義オブジェクトの形式でサーバーからデータを取得する次の関数があるとします。たとえば、オブジェクトを PersonalEntry として定義しましょう。

def retrieve_people()
    // returns a list of all latest people objects, with fields equal to those in PersonEntry

def retrieve_books()
    // returns a list of all latest book objects regardless of author, with fields equal to those in BookEntry, contains attribute, 

両方のユーザー定義クラスには、ディクショナリ内のすべての属性を返す .as_dict() メソッドがあります。

この関数が呼び出されるたびにモデルを更新したいと思います (つまり、そのモデルのインスタンスが既に存在する場合はフィールドを更新し、そうでない場合はモデルの新しいインスタンスを定義します)。これが私の現在の設定です。

class PersonEntry(models.Model):
    name = models.CharField(max_length = 50)
    age = models.IntegerField()
    biography = models.CharField(max_length = 200)

    def update_persons():
         try: 
             temp = retrieve_person()
             for person in temp:
                 match = PersonEntry.objects.filter(name = person.name(), age = person.age())
                 match.update(**person.as_dict())
         except DoesNotExist:
             PersonEntry.create(**person.as_dict())


class BookEntry(models.Model):
    author = models.ForeignKey(PersonEntry)
    author_name = models.CharField(max_length = 50) //books return redundant info
    author_age = models.IntegerField() //books return redundant info
    title = models.CharField(max_length = 50)
    summary = models.CharField(max_length = 200)

    def update_books():
         try: 
             temp = retrieve_books()
             for book in temp:
                 match = BookEntry.objects.filter(title = temp.title())
                 match.update(**book.as_dict(), associate_person(book.author_age(), book.author_name()))
         except DoesNotExist:
             BookEntry.create(**book.as_dict(), associate_person(book.author_age(), book.author_name())

    def associate_person(age, name):
         return PersonEntry.get(name = name, age = age)

より一般的な質問は、データを返す関数がある場合、モデルをリレーションシップで更新するにはどうすればよいかということだと思います。モデル自体にメソッドがありますか、それとも 1 レベル上にありますか (つまり、update_books を Person モデルに移動します)。

4

2 に答える 2

0

私はあなたの質問を完全に理解していないことを告白しますが、あなたが調べる必要があるパントを取ります.

Managers

一般に、django では、すべてが可能な限り怠惰に行われます。つまり、実際に使用しようとするまで何も更新されません。そのため、モデルや関係を更新するのではなく、それらが何であるかを宣言するだけです (おそらくマネージャーを使用)。 )その後、尋ねられたときにのみ現在の値を計算します。

于 2012-09-12T00:45:34.643 に答える
0

ある種のモデルのコレクション (またはクエリセット) を返すメソッドは、Managersの一部である必要があります。したがって、あなたの場合update_books、 のカスタム マネージャーにある必要があり、 のカスタム マネージャーにあるBookEntry必要update_personsがありますPersonEntry

retrieve_*また、モデルまたはマネージャー内から関数を呼び出さないでください。メソッド自体がマネージャー/モデルの一部でない限り、アプリケーションロジックで呼び出してから、その結果をマネージャーメソッドに渡します。

filter個別のandupdateメソッドは必要ありません。データを取得した方法に応じて、pkを直接実行できますsaveDjango がいつ作成または更新するかを知る方法を参照してください

于 2012-09-12T07:14:44.253 に答える