1

私はDjangoコードスニペットのこの小さな宝石を使用して、ManyToManyFieldを両方向から編集しています。

class ManyToManyField_NoSyncdb(models.ManyToManyField):  
    def __init__(self, *args, **kwargs):  
        super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs)
        self.creates_table = False  

class Job(models.Model):  
    persons = ManyToManyField_NoSyncdb( Person, blank=True, db_table='person_jobs' )

(スニペットの詳細はこちら

これにより、ジョブフォームから特定のジョブのすべての人を選択でき、逆に、人フォームから人のすべてのジョブを選択して、どちらの場合も単一のjobs_personsテーブルを更新できます。

ただし、Django 1.0から1.2に移行すると、creates_tableは明らかに基本クラスでサポートされていないプロパティであるため、syncdbは重複テーブルエラーを生成するようになりました。

RelatedFieldのテーブルを作成しないようにDjango1.2に指示する別の方法はありますか?

4

3 に答える 3

2

モデルの「管理された」メタ オプションが役立つ場合があります。http://docs.djangoproject.com/en/1.2/ref/models/options/#managedから

managed=False のモデルに、別の管理されていないモデルを指す ManyToManyField が含まれている場合、多対多結合の中間テーブルも作成されません。ただし、1 つのマネージド モデルと 1 つのアンマネージド モデルの間の中間テーブルが作成されます。

このデフォルトの動作を変更する必要がある場合は、中間テーブルを明示的なモデル (必要に応じて管理セットを使用) として作成し、ManyToManyField.through 属性を使用してリレーションがカスタム モデルを使用するようにします。

于 2011-02-05T18:24:35.050 に答える
1

Etienne も言及している Django のチケット #897 に新しいソリューションを投稿させてください。Django 1.2 で問題なく動作します。

class Test1(models.Model):
    tests2 = models.ManyToManyField('Test2', blank=True)

class Test2(models.Model):
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)
于 2012-02-14T10:00:55.847 に答える
1

そのため、Admin で両方のモデルの ManyToMany にアクセスしたい場合、現在の公式の解決策は、2 番目のモデルにinlinemodelを使用することです。私も数日前に同じ問題/ニーズを抱えていました。そして、私はinlinemodelソリューションに本当に満足していませんでした(多数のエントリがある場合、DB クエリが重く、filter_horizontalウィジェットを使用できないなど)。

私が見つけた解決策(Django 1.2+およびで動作していますsyncdb)は次のとおりです。

class User(models.Model):
    groups = models.ManyToManyField('Group', through='UserGroups')

class Group(models.Model):
    users = models.ManyToManyField('User', through='UserGroups')

class UserGroups(models.Model):
    user_id = models.ForeignKey(User)
    group_id = models.ForeignKey(Group)

    class Meta:
        db_table = 'app_user_group'
        auto_created = User

詳しくはチケット897をご覧ください。

残念ながら、Southapp_user_groupを使用している場合は、自動的に作成されるすべての移行ファイルでテーブルの作成を削除する必要があります。

于 2011-02-05T20:57:13.050 に答える