【问题标题】:How to fix QuerySet' object has no attribute issue?如何修复 QuerySet' 对象没有属性问题?
【发布时间】:2020-01-21 21:25:36
【问题描述】:

我需要创建新对象,或者如果已经存在就更新。我收到:QuerySet' 对象没有属性“座位”。不知道我做错了什么。

型号:

class rows_and_seats(models.Model):
    movie = models.ForeignKey(Movies, on_delete=models.CASCADE)
    row = models.CharField(max_length = 1)
    number = models.IntegerField()

    def __str__(self):
        return f'{self.movie}' 

class Reservation(models.Model):
    customer = models.ForeignKey(User, on_delete=models.CASCADE)
    movie = models.ForeignKey(Movies, on_delete=models.CASCADE)
    seat = models.ManyToManyField(rows_and_seats)
    ordered = models.DateTimeField(default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), blank=True, null=True) 

    def __str__(self):
        return f'{self.customer.username}:{self.movie.title}:{self.ordered}'

观看次数

@login_required
def buy_seats(request, pk):
    if request.method == "POST" and request.session.get("seats"):
        seats = request.session.pop("seats")
        movie = Movies.objects.get(pk=pk)
        customer = User.objects.get(pk=request.user.id)
        for s in seats:
            user_reserved_seats = rows_and_seats.objects.get(movie=movie, row=s[:1], number=int(s[2:]))

            reservation_check = Reservation.objects.filter(customer=customer, movie=movie)
            if reservation_check.exists():
                reservation_check.seat.add(user_reserved_seats)
            else:
                new_reservation = Reservation.objects.create(customer=customer, movie=movie)
                new_reservation.seat.add(user_reserved_seats)



        messages.success(request,"You have succesfully reserved the seats.")
        return redirect("home")
    return redirect("home")

我的目标是在 manyTomany 中保留 rows_and_seat,以便在管理面板中仅显示一个用户预订,而不是重复标题列表。

【问题讨论】:

  • reservation_check 是一个查询集,Reservation.objects.filter(.. 可以返回多个Reservation 对象。
  • @gdef_ 更改为 objects.get 现在它返回它没有属性 exists() hmmm
  • .get( 将只返回一个值而不是查询集,或者如果找不到任何匹配项将引发错误。您确定只会返回 0 或 1 个结果吗?还是有可能拥有多个reservation_checks?

标签: django


【解决方案1】:

您可以在exists()检查后访问该值:

if reservation_check.exists():
    reservation_check.first().seat.add(user_reserved_seats)
else:
    new_reservation = Reservation.objects.create(customer=customer, movie=movie)
    new_reservation.seat.add(user_reserved_seats)

也许你可以使用类似get_or_create:

user_reserved_seats = rows_and_seats.objects.get(movie=movie, row=s[:1], number=int(s[2:]))
reservation, created = Reservation.objects.get_or_create(
    customer=customer, movie=movie,
)
reservation.seat.add(user_reserved_seats)

另外,您可能会在座位上循环太多次,也许您可​​以在一个作业中添加所有座位。

【讨论】:

  • 为我工作,非常感谢 :) 我是 django 新手,仍然犯了很多错误
  • 没问题!检查我的编辑,也许你可以使用get_or_createupdate_or_create 之类的东西。查看文档,django 的文档非常好。
  • 酷,很有魅力 :) 更少的代码 = 更好的代码!其实我有最后一个小问题,如果你不介意的话。创建新预订时,新信息也会显示在多对多中的先前预订中。应该存在的正确数据以灰色突出显示,但我仍然想摆脱其余的东西。
  • 太棒了!抱歉,我不完全理解这个新问题,也许你可以创建一个包含更多数据和示例的新帖子,我可以看看。另外,如果您不介意对答案进行投票,那就太好了!感谢您接受它是正确的!
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2020-10-31
  • 2021-06-12
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多