1

次のモデルの既存のアプリがあります

class Contact(models.Model):
     lastname = models.CharField(max_length=200)
     firstname = models.CharField(max_length=200)
     ...

class Journalist(Contact):
     pass

私はContact自分のデータベースにを持っています、そしてそれがになることを望みますJournalist

生のSQLでは、それはと同じくらい単純に見えinsert into app_journalist values (25624);ます。この例では、25624は既存の連絡先のIDです。正常に動作しているようで、djangoアプリは満足しているようです。

ただし、djangoORMでも同じことをしたいと思います。ジャーナリストID()を強制するなど、いくつかの考えを試しJournalist(id=25624)ましたが、既存の連絡先にリンクするのではなく、新しい連絡先を作成します。

Django ORMでそれを行うことは可能ですか?どのように?

よろしくお願いします

4

3 に答える 3

3

これを解決する1つの方法は、(モデル構造を変更せずに)インスタンスのcontact_ptr属性をJournalist適切なContactインスタンスに設定することです。例えば

contact = Contact.objects.get(pk = 25624)
journalist = Journalist(contact_ptr = contact)
journalist.save()

これは、最初にテーブルを見ると理解しやすくなりますapp_journalist。列は1つだけcontact_ptr_idです。したがって、実行すると、SQLレベルでinsert into app_journalist values (25624)設定することになります。同様に、ORMレベルでcontact_ptr_id = 25624を設定する必要があり ます。contact_ptr = <instance of Contact>

アップデート

問題を解決する方法は他にもありますが、既存のモデルを変更する必要があります。@ bugspy.netが指摘したように、一般的な関係を使用できます。または、追加のフィールドを宣言してtype、連絡先がジャーナリスト、同僚などであるかどうかを指定する こともできます。

アップデート2

また、ポリモーフィック継承を使用できるようにするこのデモスニペット(および完全なコード)もご覧ください(SQLAlchemyはすでにこれを行っています)。

アップデート3

@luc自身が指摘したように(以下のコメントを参照)

journalist = Journalist(contact_ptr = contact)

単独では十分ではありません。firstnameこれにより、とlastnameのが上書きさcontact""ます。これを回避するには、各フィールドをに明示的に割り当てる必要がありますJournalist

于 2010-10-06T09:31:51.913 に答える
2

DjangoのContenttypesフレームワークは本当に便利です。これを使用して、さまざまな連絡先タイプを表すことができます。

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Contact(models.Model):
     lastname = models.CharField(max_length=200)
     firstname = models.CharField(max_length=200)
     content_object = generic.GenericForeignKey('content_type', 'object_id')
于 2010-10-06T09:55:35.060 に答える
0

モデルレベルでの継承は、通常、それほど良い考えではありません。ほとんどのORMはあなたにそれをさせます。ほとんどのORMは、それができることを誇りに思っています。モデルレベルでは、有名な「継承よりも構成を好む」がこれまで以上に真実です。

あなたの場合、「ジャーナリストは人です」と言う代わりに、 「人には仕事があり、この場合はジャーナリストです」と言うことができます。これは、Jobクラスで構成されるPersonクラスによって表されます。仕事の1つは「ジャーナリスト」である可能性があります。

構成アプローチでは、人に転職させたり、複数の仕事をさせたりすることができます。

もちろん、これはあなたの質問に直接答えるものではありませんが、他の答えはすでにかなり良いです!

于 2010-10-06T11:10:37.277 に答える