簡體   English   中英

如何在 Django 中保存多對多關系

[英]how to save Many to Many relationship in django

如何為具有多對多字段的 Django 模型創建對象?

從上面的問題我開始知道我們只能在以后保存多對多字段。

模型.py

class Store(models.Model):
   name = models.CharField(max_length=100)

class Foo(models.Model):
   file = models.FileField(upload_to='')
   store = models.ManyToManyField(Store, null=True, blank=True)

視圖.py

new_track.file = request.FILES['file']
new_track.save()

並且文件上傳工作正常然后我修改我的代碼以添加商店然后我在這里......

現在我確定 db 返回 id 在這里。 然后我嘗試使用下面的代碼,但這只是給了我錯誤

    x = new_track.id
    new = Foo.objects.filter(id=x)
    new.store.id = request.POST['store']
    new.save()

好的,所以這里的錯誤是'QuerySet' object has no attribute 'store'

而且我也嘗試add現在也可以使用。 所以問題是如何保存()

new.stores.all()

返回鏈接到該對象的所有商店。

也許:

  1. 將 Foo 更改為軌道
  2. Tracks.objects.filter(id=x) 到 Tracks.objects.get(id=x)

讓我知道事情的后續

保存具有 manytomany 關系的對象的正確方法是:

...
new_track.file = request.FILES['file']
new_track.save()

new_store = Store.objects.get(id=int(request.POST['store']))
new_track.store.add(new_store)

為什么這種混亂如此之多..然后你在那里得到了 id,給商店打電話

new_track.save()
new_track.store.add(request.POST['store'])

截至 2020 年,這是我將多對多字段保存到給定對象的方法。

簡答

class HostingRequestView(View):
    def post(self, request, *args, **kwargs):
        form = VideoGameForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.updated_by = request.user
            obj.save()

            selected_categories = form.cleaned_data.get('category') #returns list of all selected categories e.g. ['Sports','Adventure']
            #Now saving the ManyToManyField, can only work after saving the form
            for title in selected_categories:
                category_obj = Category.objects.get(title=title) #get object by title i.e I declared unique for title under Category model
                obj.category.add(category_obj) #now add each category object to the saved form object
            return redirect('confirmation', id=obj.pk)

完整答案

模型.py

class Category(models.Model):
    title = models.CharField(max_length=100, null=True, unique=True)

class VideoGame(models.Model):
    game_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50, blank=False, null=False)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, on_delete=models.CASCADE)
    category = models.ManyToManyField(Category) #ManyToMany Category field
    date_added = models.DateTimeField(auto_now_add=True, verbose_name="date added")

forms.py 模型表單

class VideoGameForm(forms.ModelForm):
    CATEGORIES = (
        ('Detective', 'Detective'),
        ('Sports', 'Sports'),
        ('Action', 'Action'),
        ('Adventure', 'Adventure'),
    )

    category = forms.MultipleChoiceField(choices=CATEGORIES, widget=forms.SelectMultiple())

    class Meta:
        model = VideoGame
        fields = ['name', 'category', 'date_added']

POST 上的 views.py

class HostingRequestView(View):
    def post(self, request, *args, **kwargs):
        form = VideoGameForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.updated_by = request.user
            obj.save()

            selected_categories = form.cleaned_data.get('category') #returns list of all selected categories e.g. ['Sports','Adventure']
            #Now saving the ManyToManyField, can only work after saving the form
            for title in selected_categories:
                category_obj = Category.objects.get(title=title) #get object by title i.e I declared unique for title under Category model
                obj.category.add(category_obj) #now add each category object to the saved form object
            return redirect('confirmation', id=obj.pk)

重定向的 URL 路徑

urlpatterns = [
    path('confirmation/<int:id>/', Confirmation.as_view(), name='confirmation'),
]

我希望這會有所幫助。 問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM