Django:禁止直接分配到多对多集的前侧。使用 user.set() 代替

Bry*_*wan 3 django many-to-many django-models

我认为这是一个常见问题,并且理解这个想法是,除非先创建它,否则无法添加多对多。我已经看到了多种解决方案,但不确定使用哪一种。

模型.py

class Concert(models.Model):
    venue = models.CharField(max_length=200, null=True)
    concertid = models.CharField(max_length = 200, null=False, default='didnotsaveproperly') 
    date = models.DateField(null=True) 
    city = models.CharField(max_length=100, null=True)
    country = models.CharField(max_length=200, null=True)
    user = models.ManyToManyField(USER_MODEL, related_name="concerts", null=True) 
    song = models.ManyToManyField("Song", blank=True, null=True)

    def __str__(self): 
        return str(self.concertid) + " " + str(self.venue) + " " + str(self.date) 
Run Code Online (Sandbox Code Playgroud)

视图.py

def log_concert_and_song(request, concertdict):
    if request.method == "POST":
        Concert_save = Concert(
        concertid=concertdict['id'], 
        date=concertdict['eventDate'], 
        venue=concertdict['venue'], 
        city=concertdict['city'], 
        country=concertdict['country'], 
        user = request.user
        )
 
    Concert_save.save() 
Run Code Online (Sandbox Code Playgroud)

我应该使用用户模型吗?

Bar*_*iak 8

add 您可以使用阅读文档添加多对多关系: https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_many/#many-to-many-relationships

def log_concert_and_song(request, concertdict):
if request.method == "POST":
    Concert_save = Concert(
    concertid=concertdict['id'], 
    date=concertdict['eventDate'], 
    venue=concertdict['venue'], 
    city=concertdict['city'], 
    country=concertdict['country'], 
    )
    Concert_save.save()

    Concert_save.user.add(request.user)
Run Code Online (Sandbox Code Playgroud)

或如错误所述:

list_of_users = [request.user,]
Concert_save.user.set([list_of_users])
Run Code Online (Sandbox Code Playgroud)

  • 惊人的。谢谢你,我很高兴我问了这个问题,尽管它看起来很明显。对我来说, .add 更有意义,所以我最终使用了它。另外,对于看到此问题的任何人,您需要在 .add() 之前先 .save() 。否则这工作正常。谢谢你巴托斯! (2认同)