Django 外键相关对象不保存更改,无法编辑

问题描述

我有两个模型,电影和评论。 Review 有一个与 Movie 相关的外键字段。我一直在尝试编辑与 Movie 实例关联的 Review 对象。

models.py

BillingResult billingResult = await inAppBilling.BillingClient.AckNowledgePurchaseAsync(ackNowledgePurchaseParams);

if (billingResult.ResponseCode == BillingResponseCode.Ok)
{
// whatever you need to do with the result
}

views.py

class Movie(models.Model):
    title = models.CharField(max_length=160)

class Review(models.Model):
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE,related_name='reviews')
    author = models.CharField(max_length=150)
    active = models.BooleanField(default=True)

views.py 代码输出如下:

    # Create and save movie object
    movie = Movie(title="Nightcrawler")
    movie.save()

    # Create and save two review objects
    review1 = Review(movie=movie,author="John",active=True)
    review2 = Review(movie=movie,author="Rob",active=False)
    review1.save()
    review2.save()

    print("Before: " + movie.title + " has " + str(len(movie.reviews.all())) + " reviews.")

    active_reviews = movie.reviews.filter(active=True)

    print("There are " + str(len(active_reviews)) + " active reviews.")
    movie.reviews.set(active_reviews)
    movie.reviews.first().author = "Abby"

    # Try and save both objects just for good measure.
    # Not sure if it is necessary to do this. Does not
    # seem to work anyway
    movie.reviews.first().save()
    movie.save()

    print("After: " + movie.title + " has " + str(len(movie.reviews.all())) + " reviews.")
    print("Author of the first review is: " + str(movie.reviews.first().author))

我希望并期望保存对 Before: Nightcrawler has 2 reviews. There are 1 active reviews. After: Nightcrawler has 2 reviews. Author of the first review is: John 所做的更改,但输出显示 movies.reviews 方法或更改作者值实际上都不会更改 Movie 实例。为什么这些编辑都没有被保留?

有趣的是,set() 行似乎确实删除了第一条评论。我很好奇为什么这有效而其他更改无效。

感谢您的宝贵时间!

解决方法

我认为这是因为您没有在变量中捕获结果。

试试这个:

rv = movie.reviews.first() # catch the first one 

rv.author = "BLA" 

rv.save()
,

如果你想操作对象,你应该先把它存储在一个变量中

movie = Movie(title="Nightcrawler")
movie.save()

# Create and save two review objects
review1 = Review(movie=movie,author="John",active=True)
review2 = Review(movie=movie,author="Rob",active=False)
review1.save()
review2.save()

print("Before: " + movie.title + " has " + str(len(movie.reviews.all())) + " reviews.")

active_reviews = movie.reviews.filter(active=True).all()

print("There are " + str(len(active_reviews)) + " active reviews.")

movie.reviews.clear()
movie.reviews.set(active_reviews)

first_review = movie.reviews.first()
first_review.author = "Abby"
first_review.save()
movie.save()

它没有被保存,因为您更新的对象与您保存的对象不同,因为您再次调用 first() 运行了另一个查询。

如果您只想保留“活跃”评论,您可以使用 remove 来移除不活跃评论。

movie.reviews.remove(*movie.reviews.filter(active=False))

set 在这里没有任何影响,因为您作为参数传递的 active_reivews 已经链接或已经设置。如果您想坚持使用 set,请先执行 clear