首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >限制Django表中的行数

限制Django表中的行数
EN

Stack Overflow用户
提问于 2013-08-08 20:27:43
回答 3查看 4.8K关注 0票数 7

我在我的模型文件中有一个表,我想设计它,使表中的行数限制为10行。超过限制时,将删除最老的行。对于某些上下文,这是用于前端显示,显示用户最近访问的10个链接。我对Django很陌生,所以如果有人对如何做这件事有建议的话,我会非常感激的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-08 20:37:30

您可以编写一个自定义save方法来检查YourObject.objects.all()的长度,然后在该长度等于10时删除最老的一个。

沿着…线的东西:

代码语言:javascript
运行
复制
def save(self, *args, **kwargs):
    if YourModel.objects.count() == 10:
        objects[0].delete()

    super(YourModel, self).save(*args, **kwargs)
票数 6
EN

Stack Overflow用户

发布于 2013-08-08 20:47:22

在我看来,您可以使用信号。在这种情况下是post_save。这样,就可以将对象创建和删除逻辑分开。

由于您希望删除oldest,所以假设您在模型中有一个created字段。

一旦你save

代码语言:javascript
运行
复制
def my_handler(sender, instance, **kwargs):
    qs = MyModel.objects.order_by('created') #ensure ordering.
    if qs.count() > 10:
        qs[0].delete() #remove the oldest element

class MyModel(models.Model):
    title = models.CharField('title', max_length=200)
    created = models.DateTimeField(auto_add_now=True, editable=False)

post_save.connect(my_handler, sender=MyModel)

当然,没有什么可以阻止您使用pre_save信号,但是只有当您绝对确信save方法不会失败时才使用它。

票数 4
EN

Stack Overflow用户

发布于 2022-01-28 15:05:01

改进一下@karthikr的答案。

我还认为事后保存信号处理程序是最好的方法,但是在类方法中隔离函数并检查created标志。例如,如果您希望保存系统发送的最后1000封电子邮件的日志:

代码语言:javascript
运行
复制
from django.db import models
from django.db.models.signals import post_save

LOG_SIZE=1000

class EmailLog(models.Model):
    """Keeps a log of the 1000 most recent sent emails."""

    sent_at = models.DateTimeField(auto_add_now=True)
    message = models.TextField()
    to_addr = models.EmailField()

    @classmethod
    def post_create(
        cls,
        sender,
        instance: "EmailLog",
        created: bool,
        *args,
        **kwargs
    ):
        if created: # Indicates if it's a new object
            qset = EmailLog.objects.order_by("sent_at") # Force ordering
            if qset.count() > LOG_SIZE:
                qset[0].delete()


post_save.connect(EmailLog.post_create, sender=EmailLog)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18135496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档