6

モデル化する必要があります。モデルオブジェクトをモデルから別のモデルにコピーしたい:Model2はModel1のコピーです(このモデルにはm2mフィールドが多すぎます)Model1:

class Profile(models.Model):
      user = models.OneToOneField(User)
      car = models.ManyToManyField(Car)
      job = models.ManyToManyField(Job)
      .
      .

これは調査アプリケーションです。ユーザーが調査に参加するときにプロファイルを保存したい(調査後にプロファイルを編集できるため)ユーザーが調査に参加するときにユーザープロファイルを保存する別のモデルを作成しました(正しい方法がわかりません)

class SurveyProfile(models.Model):
      user = models.OneToOneField(SurveyUser) #this is another model that takes survey users
      car = models.ManyToManyField(Car)
      job = models.ManyToManyField(Job)

プロファイルからSurveyProfileにユーザープロファイルをコピーするにはどうすればよいですか。

前もって感謝します

4

5 に答える 5

10

deepcopyクラス/モデルが異なるため、などは機能しません。

SurveyProfile* に存在するすべてのフィールドがあると確信している場合Profile、これは機能するはずです (テストされていません)。

for field in instance_of_model_a._meta.fields:
    if field.primary_key == True:
        continue  # don't want to clone the PK
    setattr(instance_of_model_b, field.name, getattr(instance_of_model_a, field.name))
instance_of_model_b.save()

*(その場合、抽象クラスを作成し、それをandProfileBaseの具象クラスとして継承することをお勧めしますが、それは私が上に置いたものには影響しません)ProfileSurveyProfile

于 2012-05-30T15:02:18.387 に答える
3

あなたが上に書いたことを理解するのに苦労しています。したがって、これが機能するかどうかは 100% 確信が持てませんが、私があなたを正しく理解していれば、次のようなことをすると思います。

class Model2Form(ModelForm):
    class Meta:
        model = models.Model2

その後

f = Model2Form(**m1.__dict__)
if f.is_valid():
    f.save()

しかし、これは何よりもまずいデータベース設計のように見えると思います。モデル全体を見なければ 1 確信が持てません。しかし、いずれにせよ、モデルレベルで継承を使用したり、同じ動作を得るために他の何かを使用したりできるのに、なぜそれをしたいのかわかりません。

于 2012-05-30T13:54:45.630 に答える
2

これが私が使用してきた関数です。これはmodel_to_dictに基づいています。Model_to_dict は外部キーの ID を返すだけで、そのインスタンスは返さないので、モデル自体に置き換えます。

def update_model(src, dest):
    """
    Update one model with the content of another.

    When it comes to Foreign Keys, they need to be
    encoded using models and not the IDs as
    returned from model_to_dict.

    :param src: Source model instance.
    :param dest: Destination model instance.
    """
    src_dict = model_to_dict(src, exclude="id")
    for k, v in src_dict.iteritems():
        if isinstance(v, long):
            m = getattr(src, k, None)
            if isinstance(m, models.Model):
                setattr(dest, k, m)
                continue

        setattr(dest, k, v)
于 2013-10-07T13:08:14.057 に答える
-1

したがって、問題を正しく解釈している場合は、古いモデル(Profile)があり、それを新しいモデルに置き換えようとしていますSurveyProfile。状況を考えると、長期的にはSouthのようなデータベース移行ツールの使用を検討することをお勧めします。今のところ、Djangoシェルでスクリプトを実行できます(manage.py shell):

from yourappname.models import *
for profile in Profile.objects.all():
    survey_profile = SurveyProfile()
    # Assuming SurveyUser has user = ForeignKey(User)...
    survey_profile.user = SurveyUser.objects.get(user=profile.user)
    survey_profile.car = profile.car
    survey_profile.job = profile.job
    survey_profile.save()

南を使用する

このプロジェクトを長期的に維持および更新する必要がある場合は、Southのようなデータベース移行パッケージを使用することを強くお勧めします。これにより、モデルのフィールドを変更し、データベースを簡単に移行できます。

たとえば、元のモデルにManyToManyField存在するが多すぎることを提案します。南では、あなたは:

  1. モデルからフィールドを削除します。
  2. スキーマ移行を自動生成します。
  3. 移行を適用します。

これにより、モデル名を変更したり、データベースをいじったりすることなく、古いコードをすべて再利用できます。

于 2012-05-31T04:48:12.390 に答える