2012-02-26 21 views
1

Django Newbie質問。私は、次のモデルがあります:脚の特定のインスタンスのdjangoの多対多リレーションシップ:アイテムを削除する方法はありますが、関連するモデルから削除する方法はありません

class Leg(models.Model): 
    drive_date = models.DateField() 
    startpoint = models.CharField(max_length=50) 
    endpoint = models.CharField(max_length=50) 
    start_time = models.TimeField() 
    riders = models.ManyToManyField(Rider, blank=True) 
    drivers = models.ManyToManyField(Driver, blank=True) 
    carpool = models.ForeignKey(Carpool, blank=True, null=True) 

が、私は脚モデルから既存のライダーやドライバーを削除したいのが、それぞれのライダーやドライバーモデル(図示せず)からそれらを削除しません。それをどうやって行うのか分かりません。私が反復するとき:

​​3210

私はしたくない実際のドライバオブジェクトを削除するようです。

ご協力いただきまして誠にありがとうございます。ありがとう!

答えて

1

私がこれにアプローチする方法の1つは、ドライバモデル用のカスタムマネージャを作成することです。以下の未テストコード:

from django.db import models 

class DriverManager(models.Manager): 
    def get_query_set(self): 
     return super(DriverManager, self).get_query_set().filter(removed=False) 

class Driver(models.Model): 
    # new stuff to add ... 
    removed = models.BooleanField(default=False) 
    objects = models.Manager() # default manager 
    active = DriverManager() # custom manager 

説明:新しいフィールド、removedは、ドライバモデルに追加されます。レコードを削除する代わりに、レコードをTrueに設定して保存します。次に、Driver.objectsを通常はフィルタリングする場所で、代わりにDriver.activeを使用します。

+0

は、応答のためにありがとうございましたようにしてください。あなたが提供している例では、ドライバーは「取り外された」か「取り外されていない」のいずれかになり、すべての足に適用されます。しかし、私はドライバーが特定の脚のインスタンスだけに取り除かれる必要がありますが、それでも他のインスタンスのためにそこに残っているので、動作するかどうかはわかりません。しかし、私はそれを試してみましょう。再度、感謝します。 – mb52089

+0

申し訳ありませんが、私は脚からドライバーを選択的に削除したいが、削除しないと思った。 あなたの場合はleg.drivers = None、leg.save()を割り当ててください。 –

+0

もう一度ありがとうございます。私はそれが何か簡単だと思った。 – mb52089

10

関係から項目を削除するには、正しいコードは次のとおりです。

for driver in leg.drivers.all(): 
    leg.drivers.remove(driver) 
0

この

leg.drivers.clear() 

.clear() to completely remove completely(efficiently) 
.remove(<related obj>) to remove one relation 
.remove([<related obj>, <related obj>...]) to remove one or more relation 
関連する問題