Django 外键相关对象不保存更改,无法编辑
Django Foreign Key Related Objects Not Saving Changes, Cannot Edit
我有两个模型,电影和评论。 Review 有一个与 Movie 相关的外键字段。我一直在尝试编辑与 Movie 实例关联的 Review 对象。
models.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))
views.py代码的输出结果如下:
Before: Nightcrawler has 2 reviews.
There are 1 active reviews.
After: Nightcrawler has 2 reviews.
Author of the first review is: John
我希望并期望保存对 movies.reviews
所做的更改,但输出显示 set()
方法或更改 author 值实际上都不会更改 Movie 实例。为什么要保留这些编辑中的 none?
有趣的是,movies.reviews.first().delete()
行似乎确实删除了第一条评论。我很好奇为什么这行得通而其他更改却行不通。
感谢您的宝贵时间!
如果你想操作对象,你应该先把它存储在一个变量中
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
。
我有两个模型,电影和评论。 Review 有一个与 Movie 相关的外键字段。我一直在尝试编辑与 Movie 实例关联的 Review 对象。
models.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))
views.py代码的输出结果如下:
Before: Nightcrawler has 2 reviews. There are 1 active reviews. After: Nightcrawler has 2 reviews. Author of the first review is: John
我希望并期望保存对 movies.reviews
所做的更改,但输出显示 set()
方法或更改 author 值实际上都不会更改 Movie 实例。为什么要保留这些编辑中的 none?
有趣的是,movies.reviews.first().delete()
行似乎确实删除了第一条评论。我很好奇为什么这行得通而其他更改却行不通。
感谢您的宝贵时间!
如果你想操作对象,你应该先把它存储在一个变量中
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
。