首页 > 解决方案 > create() 用相关表中的每一行填充 manytomany,而不是将其留空

问题描述

目前,我在 models.py 中有三个模型:

class User(AbstractUser):
    pass 

class Watchlist(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    listings = models.ManyToManyField('Listing', related_name = "watchlists", blank = True)

class Listing(models.Model):
    title = models.CharField(max_length = 150)
    description = models.TextField()

当用户创建他们的关注列表时会出现问题,该关注列表由 views.py 中的这段代码处理:

# Each listing has it's own page,
# with a URL of the form /listing/<int:pk> 
def listing(request, pk):
    listing_instance = Listing.objects.get(pk = pk)
    
    if request.method == "GET":
         # return the page for the listing with primary key pk

    elif request.user.is_authenticated:   
        watchlist_instance = Watchlist.objects.get_or_create(user = request.user)[0]
        watchlist_instance.listings.add(listing_instance)

我希望由创建的行在Watchlist.objects.get_or_create(user = request.user)它的 中没有关系listings,而是它与列表表中的每一行都有关系(意味着最后一行什么都不做)。

例如,如果列表表包含三行:

并且一个新用户查看了列表 2 的页面并尝试将其添加到他们的关注列表中,他们的关注列表将包括所有三个列表。

为了确认create()是导致问题的原因,我尝试了这个:

    elif request.user.is_authenticated:
        watchlist_instance = listing_instance.watchlists.create(user = request.user)

这看起来(对我来说)基本上等同于create() 官方文档中给出的示例,但与我的其他代码有相同的问题。

我怎样才能确保create()留下listings空白(以便我可以将单曲添加listing_instance到其中),而不是用表格中的每个列表填充它?

编辑:即使在 Django 的管理界面中创建监视列表,问题仍然存在;该字段会自动填充每个listing. clear()此外,无法通过remove()或在管理界面中删除关系。

Django 版本 3.1.1

sqlite3

蟒蛇 3.8.6

标签: pythonpython-3.xdjangodjango-models

解决方案


OP是个白痴,这个问题从来没有存在过。

我假设 Django 的监视列表管理页面只会显示相关的列表,但事实证明它只显示每个列表,无论它们是否相关。


推荐阅读