2016-05-06 2 views
2

モデルを完全に書き換えなくても、多対多の関係を一部のモデルに挿入したいと考えています。多対多リレーションシップをサードパーティ製のモデルに挿入する方法はありますか?

たとえば、私がインストールしたサードパーティ製モジュールのdjango UserモデルとモデルFooを考えてみましょう。私は、ユーザーにFooを追加したい場合は、

class Foo(models.Model): 
    users = models.ManyToMany(User) 

その後、またはその逆の私が行うことができます::私はfoo「を所有している」の場合

私はやるだけの可能性が

my_user.foo_set.add(my_foo) 
my_foo.users.add(my_user) 

しかし、私どちらかのコードを所有していない、私はこの関係を注入したい、私は上記を行うことができます。

私が望んでいたのであれば、私が作ったモデルを通してスルー・リレーションシップを行い、それを両側に置くこともできましたが、それでもモデルを変更する必要があります。今

、それはDjangoのように見えるシーンの背後にある多対多の関係ですモデル(彼らは間違いなくテーブルを持っている)、このコードを作ることが可能である:

class FooUserRelationship(models.Model): 
    foo = ForeignKey(Foo) 
    user = ForeignKey(User) 
だけ多くの-たい

法何か関係?

+0

あなたのコントロール下でモデルから多対多の関係を定義することができるはずです。あなたのケースでは 'User'をサブクラス化し、その関係をバックリファレンスで追加し、設定で' AUTH_USER_MODEL'を定義します。 –

答えて

1

プロキシモデルを使用できます。ここで人はサードパーティのモデルであり、Mypersonはメインモデルの余分な属性を変更するモデルです。詳細https://docs.djangoproject.com/en/1.9/topics/db/models/#proxy-models

from django.db import models 

class Person(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

class MyPerson(Person): 
    users = models.ManyToMany(User) 
    class Meta: 
     proxy = True 
+0

閉じる。しかし、それほどではない。両方の具体的なモデルで関係を見る必要があります。これは気の利いたので、議決権を持ってください。 –

1

ため私は考えることができるクリーンな方法は、中産階級を提供するために、(あるいはあなたがほぼ同じクエリを提供するどのサブクラス化できる)で片側にonetooneで、その後多くの

に多くの

結果を取得する際にこれ以上SQL結合が必要なので、これは最もクリーンな方法ではありませんが、あなたのリンクを変更しないでください。

関連する問題