Python 在保存()之前使用多对多项目

Python 在保存()之前使用多对多项目,python,django,Python,Django,我使用的模型具有多对多字段 我想做的就是这样 tweets = fetchfromweb() filtered = [] for tweet in tweets: tweet.save() ## save and create manytomanyfield if tweet.text == x : tweet.genre.add(genreObj) tweet.save() else: tweet.remove() 从

我使用的模型具有多对多字段

我想做的就是这样

tweets = fetchfromweb()

filtered = []
for tweet in tweets:
    tweet.save() ## save and create manytomanyfield
    if tweet.text == x :
        tweet.genre.add(genreObj)
        tweet.save()
    else:
        tweet.remove()
  • 从web获取项目并存储在内存中

  • 筛选项目。删除或添加多对多字段

  • 保存在数据库中

  • 我的模型

    class Tweet(models.Model):
        text = models.TextField(null=True)
        genre = models.ManyToManyField(genre)
    
    滤器

    tweets = fetchfromweb()
    
    filtered = []
    for tweet in tweets:
        if tweet.text == x :
            tweet.genre.add(genreObj)
            filtered.append(tweet)
        else:
            pass
    
    for i in filtered: // write in db
        i.save()
    
    但是,它在
    tweet.genre.add(genreObj)
    处显示错误

    没有save(),我无法访问多对多字段

    所以现在我的解决方案是这样的

    tweets = fetchfromweb()
    
    filtered = []
    for tweet in tweets:
        tweet.save() ## save and create manytomanyfield
        if tweet.text == x :
            tweet.genre.add(genreObj)
            tweet.save()
        else:
            tweet.remove()
    
    然而,它需要许多数据库插入和删除,这是一个良好的做法吗


    或者有什么好主意吗?

    您不能在保存
    tweet
    之前添加M2M记录,因为
    tweet
    需要在添加M2M相关记录之前设置主键。你可以查一下电话号码

    不确定此gona是否有效,但您可以尝试交易:

    with transaction.atomic():
        for tweet in tweets:
            tweet.save() ## save and create manytomanyfield
            if tweet.text == x :
               tweet.genre.add(genreObj)
        else:
            tweet.remove()
    

    此外,在添加M2M记录后,您无需再次调用
    save

    I取消存储。我必须先使用save()。非常感谢你