问题描述
我有两个模型,电影和评论。 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)
# 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
。