微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。