【问题标题】:Python/Django: How to delete an instance automatically after an action?Python/Django:如何在操作后自动删除实例?
【发布时间】:2016-08-06 18:34:25
【问题描述】:

我创建了一个 Django 项目,其中类型 1 用户可以创建帖子,类型 1 用户可以对帖子进行投标。最后,拍卖发生并且 post_owner 可以接受出价。在这整个过程之后,我想从数据库中删除 post 实例,这样它就不会出现在 post_queryset 中。为此,我尝试使用拍卖后收到的信号,并在从 Post 模型中删除实例之前保留它。但这行不通。有没有办法解决这个问题?我将不胜感激帮助我实现这一目标。

这是我的代码:

模型.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)

【问题讨论】:

    标签: django django-models django-signals


    【解决方案1】:

    如果您真的想删除该对象,那么执行此操作的最佳位置可能是在您用于接受出价的视图中,在您使用该对象之后的某个时间,但在您将页面返回到之前用户。这可以通过覆盖适当的函数在基于类的视图中完成。

    或者,如果您只是想将其从查询集中排除,您可以在模型中添加一行,例如:

    accepted = models.BooleanField(default=False)
    

    只需让您的视图将此值设置为 True。这样,如果用户想要反转某些内容,数据将被保留。然后,您可以使用 Post.objects.filter(accepted=False) 之类的查询集来仅检索您正在查找的 Post 对象。

    至于你的信号,也许其他人可以帮助你让它按照你设置的方式工作,但我不确定应该如何从类中调用信号。通常,它们不会放在文件中的类中,而只是独立的方法。但是,我看到有些人更喜欢将它们放在模型类中并将它们标记为@classmethod

    我更喜欢将它们作为方法放在单独的 signals.py 文件中,并通过那里路由我的导入:

    from My_app.signals import Post
    

    【讨论】:

    • @Adam_Starrh,我按照你说的做了,在我的 Post 模型中添加了一个 BooleanField(accepted)。在我的 accept_bid 视图中,我使用 ModelForm (AcceptedForm) 传递这个值,就像我的问题一样。在这里,我创建了用于保存 accept_bid 实例以及保存 BooleanField 值的视图。但是在保存实例时,它会返回 IntegrityError : (1048, "Column 'date' cannot be null")。你能帮我解决这个问题吗!!!
    • 听起来您要么需要将信息传递到模型中的date 字段,要么在此字段上设置null=True。如果您需要进一步的帮助,请在新问题中发布您的模型和视图。
    猜你喜欢
    • 2020-12-27
    • 2019-02-25
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多