Python/Django: 如何在操作后自动删除实例?
Python/Django: How to delete an instance automatically after an action?
我创建了一个 Django 项目,其中类型 1 用户可以创建 Post,类型 1 用户可以对 post 出价。最后,进行拍卖,post_owner 可以接受出价。在这整个过程之后,我想从数据库中删除 post 实例,这样它就不会出现在 post_queryset 中。为此,我尝试使用拍卖后收到的信号,并在从 Post 模型中删除实例之前保留它。但这不起作用。有什么方法可以解决这个问题吗?我很乐意帮助我实现这一目标。
这是我的代码:
Models.py:
class Post(models.Model):
item = models.CharField(max_length=20)
post_owner = models.OneToOneField(settings.AUTH_USER_MODEL, default=1)
date = models.DateField()
accepted = models.BooleanField(default = False)
objects = PostQuerySet.as_manager()
class Bid(models.Model):
post = models.ForeignKey(Post, related_name = bids)
amount = models.IntegerField(max_length = 20)
bidder = models.ForeingKey(settings.AUTH_USER_MODEL)
class Auction(models.Model):
post = models.OneToOneField(Post)
post_owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
bid = models.OneToOneField('truck.Bid', related_name='auctions')
class PostQuerySet(models.QuerySet):
@receiver(post_save, sender=Auction)
def delete(self, sender, instance, *args, **kwargs):
instance.from1.delete
super(PostQuerySet, self).delete(*args, **kwargs)
forms.py:
class AcceptedForm(forms.ModelForm):
accepted = forms.BooleanField(required=False)
class Meta:
model = Post
fields = ('accepted', )
Views.py:
def accept_bid(request, post_id, bid_id):
post = get_object_or_404(Post, id=post_id)
bid = get_object_or_404(Bid, id=bid_id)
if request.method=='POST':
form = AuctionForm(request.POST or None)
form1 = AcceptedForm(request.POST)
if form.is_valid() and form1.is_valid():
accept_bid = form.save(commit=False)
accept_bid.bid = bid
accept_bid.post = post
accept_bid.post_owner = request.user
accept_bid.accepted = form1.save()
accept_bid.save()
form.save()
form1.save()
else:
form = AuctionForm()
form1 = AcceptedForm()
context = {
"bid_id" : bid_id,
"post_id" : post_id,
"bid": bid,
"post":post,
'form':form,
'form1': form1,
}
return render(request, 'loggedin_load/active_deals.html', context)
如果您真的想删除该对象,最好的地方可能是在您使用该对象接受出价的视图中,在您使用该对象之后的某个时间,但在您返回之前页面给用户。这可以通过覆盖适当的函数在 Class 基于视图中完成。
或者,如果您只是想将其从查询集中排除,您可以在模型中添加一行,例如:
accepted = models.BooleanField(default=False)
只需让您的视图将此值设置为 True。这样,如果用户想要反转某些内容,数据将被保留。然后,您可以使用 Post.objects.filter(accepted=False)
之类的查询集来仅检索您要查找的 Post 个对象。
至于你的信号,也许其他人可以帮助你让它按照你设置的方式工作,但我不确定应该如何从 class 中调用信号.通常,它们不会放在文件中的 classes 中,而只是独立的方法。但是,我看到有些人更喜欢将它们放在模型 class 中并将它们标记为 @classmethod
。
我更喜欢将它们作为方法放在单独的 signals.py
文件中,并通过那里路由我的导入:
from My_app.signals import Post
我创建了一个 Django 项目,其中类型 1 用户可以创建 Post,类型 1 用户可以对 post 出价。最后,进行拍卖,post_owner 可以接受出价。在这整个过程之后,我想从数据库中删除 post 实例,这样它就不会出现在 post_queryset 中。为此,我尝试使用拍卖后收到的信号,并在从 Post 模型中删除实例之前保留它。但这不起作用。有什么方法可以解决这个问题吗?我很乐意帮助我实现这一目标。
这是我的代码:
Models.py:
class Post(models.Model):
item = models.CharField(max_length=20)
post_owner = models.OneToOneField(settings.AUTH_USER_MODEL, default=1)
date = models.DateField()
accepted = models.BooleanField(default = False)
objects = PostQuerySet.as_manager()
class Bid(models.Model):
post = models.ForeignKey(Post, related_name = bids)
amount = models.IntegerField(max_length = 20)
bidder = models.ForeingKey(settings.AUTH_USER_MODEL)
class Auction(models.Model):
post = models.OneToOneField(Post)
post_owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
bid = models.OneToOneField('truck.Bid', related_name='auctions')
class PostQuerySet(models.QuerySet):
@receiver(post_save, sender=Auction)
def delete(self, sender, instance, *args, **kwargs):
instance.from1.delete
super(PostQuerySet, self).delete(*args, **kwargs)
forms.py:
class AcceptedForm(forms.ModelForm):
accepted = forms.BooleanField(required=False)
class Meta:
model = Post
fields = ('accepted', )
Views.py:
def accept_bid(request, post_id, bid_id):
post = get_object_or_404(Post, id=post_id)
bid = get_object_or_404(Bid, id=bid_id)
if request.method=='POST':
form = AuctionForm(request.POST or None)
form1 = AcceptedForm(request.POST)
if form.is_valid() and form1.is_valid():
accept_bid = form.save(commit=False)
accept_bid.bid = bid
accept_bid.post = post
accept_bid.post_owner = request.user
accept_bid.accepted = form1.save()
accept_bid.save()
form.save()
form1.save()
else:
form = AuctionForm()
form1 = AcceptedForm()
context = {
"bid_id" : bid_id,
"post_id" : post_id,
"bid": bid,
"post":post,
'form':form,
'form1': form1,
}
return render(request, 'loggedin_load/active_deals.html', context)
如果您真的想删除该对象,最好的地方可能是在您使用该对象接受出价的视图中,在您使用该对象之后的某个时间,但在您返回之前页面给用户。这可以通过覆盖适当的函数在 Class 基于视图中完成。
或者,如果您只是想将其从查询集中排除,您可以在模型中添加一行,例如:
accepted = models.BooleanField(default=False)
只需让您的视图将此值设置为 True。这样,如果用户想要反转某些内容,数据将被保留。然后,您可以使用 Post.objects.filter(accepted=False)
之类的查询集来仅检索您要查找的 Post 个对象。
至于你的信号,也许其他人可以帮助你让它按照你设置的方式工作,但我不确定应该如何从 class 中调用信号.通常,它们不会放在文件中的 classes 中,而只是独立的方法。但是,我看到有些人更喜欢将它们放在模型 class 中并将它们标记为 @classmethod
。
我更喜欢将它们作为方法放在单独的 signals.py
文件中,并通过那里路由我的导入:
from My_app.signals import Post