2016-09-06 10 views
2

DjangoでForeignKeyManyToManyの関係を使用しているときに、オブジェクトのリストからオブジェクトを削除できません。ここでManyToMany関係を持つDjangoのQuerySetリストからオブジェクトを削除する

は、私はアイテム、リスト、および受注(仲介モデル)用に設定されているモデルです。

class Item(models.Model): 
    title_english = models.CharField(max_length=250) 
    url = models.CharField(max_length=250) 
    img_url = models.CharField(max_length=250) 

    def __unicode__(self): 
     return self.title_english 

class List(models.Model): 
    slides = models.ManyToManyField(Item, through='Order') 
    size = models.PositiveIntegerField(default=0) 

    def incrementSize(self): 
     self.size = self.size+1 

    def __unicode__(self): 
     return "List: " + str(self.slides.all()) 

class Order(models.Model): 
    item = models.ForeignKey(Item, on_delete=models.CASCADE) 
    list = models.ForeignKey(List, on_delete=models.CASCADE) 
    index = models.PositiveIntegerField() 

    def __unicode__(self): 
     return str(index) + ": " + str(self.item) 

    def appendItemToList(self, item, list): 
     self.item = item 
     self.list = list 
     self.index = list.size 
     list.incrementSize() 

私はそうのようなビューを介して、(既存のオブジェクトから動的に作成された)リストにオブジェクトを追加してい:

def AddItem(request, pk): 
    sourceObj = SourceObject.objects.get(pk=pk) 
    lst = List.objects.all() 
    if not lst: 
     lst = List() 
     lst.save() 
    else: 
     lst = lst[0] 
    item = Item(title_english=sourceObj.name_english, url=sourceObj.slug, img_url=sourceObj.media) 
    item.save() 
    order = Order() 
    order.appendItemToList(item, lst) 
    order.save() 
    lst.save() 
    return redirect("some_url") 

は今私の問題はlistに追加された項目を削除すること、です。私はターゲットオブジェクトにどのようにアクセスできるかを理解することができません。

def RemoveItem(request, pk): 
    lst = List.objects.all() 
    lst.delete() #deletes the entire list 
    #how do I access the target object from here to delete it 
    return redirect("some_url") 

私はここで、「後方次の関係」を参照Djangoのドキュメントを読んで:https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects

しかし、私は働く解決策を見つけることができませんでした。

注:あなたのターゲットは 'PK' あなただけのList.objects.getを使用することができます(PK).delete()からに参照される項目がある場合、私はジャンゴ1.5とPython 2.7

+0

ビューは理にかなっていません1つのpkしか持っていない、どのように削除するか知っていますか?あなたの目標は誰ですか? –

+0

私のターゲットは 'item'です。私は 'item'のtitle_englishフィールドと' sourceObj'のtitle_englishフィールドを比較するためにQuerySetフィルタを使うことを考えていました。 'list'から' item'を削除してください。私はちょうど – hammerabi

+0

btwで始まるリストの 'items'にアクセスする方法がわかりません。ちょうど気づいた、あなたはdjango 1.5を使っていますか?現在のバージョンは1.10です。これは本当に古いものです... –

答えて

3

を使用しています。

は、try内でこれを入れてください:List.DoesNotExist除い:手動でURLのランダムな文字列を入力することにより、500Sをtrigerring人々を避けるために。

try: 
    List.objects.get(pk).delete() 
except List.DoesNotExist: 
    do_something_when_item_does_not_exist() 
return redirect("some_url") 

別のオプションは、アイテムを取得するには「get_object_or_404」関数を使用している、これは私の意見では理にかなっているURLに与えられたアイテムが存在しない場合はhttp404例外を発生させます。

item = get_object_or_404(List, pk) 
item.delete() 
return redirect("some_url") 

あなたが特定のリスト内の特定のアイテムを探している場合には、あなたは

URLあなたのURLで、ビュー内の2つの引数が必要です:

​​

を表示:

def delete(request, list_id, item_id): 
    item = get_object_or_404(List, pk=item_id, list_id=list_id) 
    item.delete() 
    return redirect("some_url") 
+0

優れた答えです。私は 'get_object_or_404'の解決法を選ぶことにしました。それは私にとっても意味をなさないようでした。 – hammerabi

関連する問題