代码之家  ›  专栏  ›  技术社区  ›  CastleDweller

如何在django admin中创建自动填充和自动递增字段

  •  15
  • CastleDweller  · 技术社区  · 16 年前

    [ 更新: 将问题标题改为更具体]

    class WhatEver():
        number = model.IntegerField('Just a Field', default=callablefunction)
    ...
    

    callablefunction

    from myproject.app.models import WhatEver
    
    def callablefunction():
        no = WhatEver.objects.count()
        return no + 1
    

    我想自动写下一个数字,但我不知道怎么做。

    我的错误来自

    我在google上搜索了一下,唯一发现的是使用save()方法自动递增数字。。。但我想把它展示在舞台上 <textfield> 保存前。。。

    4 回复  |  直到 16 年前
        1
  •  28
  •   Alan W. Smith vishes_shell    9 年前

    知道了! 我希望这能帮助所有在django中自动填充和自动递增字段有任何问题的人。解决方案是:

    class Cliente(models.Model):
        """This is the client data model, it holds all client information. This
           docstring has to be improved."""
        def number():
            no = Cliente.objects.count()
            if no == None:
                return 1
            else:
                return no + 1
    
        clientcode = models.IntegerField(_('Code'), max_length=6, unique=True, \
        default=number)
    
        [... here goes the rest of your model ...]
    

    • number
    • 这是写的 之前
    • 这在django 1.2.1上进行了测试

    此功能将自动填充 clientcode 包含下一个数字的字段(即,如果您有132个客户机,则当您添加下一个客户机时,该字段将填充 客户端代码

    [更新:如我在评论中所述,有一种方法可以使用主键,但不会填充字段 之前 [保存]

        2
  •  8
  •   Yuval Adam    16 年前

    auto-generated primary key

    id = models.AutoField(primary_key=True)
    

    似乎您正试图复制一个已经存在的行为,只需使用对象主键。

        3
  •  6
  •   Jacob Valenta    11 年前

    一、 同样,遇到这个问题,我的例子是 customer.number 这是相对于客户而言的 Store . 我很想用这样的东西:

    # Don't do this:
    
    class Customer(models.Model):
        # store = ...
        number = models.IntegerField(default=0)
    
        def save(self, *args, **kwargs):
            if self.number == 0:
                try:
                    self.number = self.store.customer_set.count() + 1
                else:
                    self.number = 1
            super(Customer, self).save(*args, **kwargs)
    

    上述情况可能会导致几个问题: 假设有10个客户,我删除了客户编号6。下一个要添加的客户(看起来)将是第10个客户,这将成为第二个客户#10。(这可能会导致 get()

    我最终得到的结果是:

    class Store(models.Model):
        customer_number = models.IntegerField(default=1)
    
    class Customer(models.Model):
        store = models.ForeignKey(Store)
        number = models.IntegerField(default=0)
    
        def save(self, *args, **kwargs):
            if self.number == 0:
                self.number = self.store.customer_number
                self.store.number += 1
                self.store.save()
            super(Customer, self).save(*args, **kwargs)
    

    附言:

    你扔了好几次,你想填写这个字段“ 之前 ". 我想您希望在保存之前填写它,以便可以访问它。对此我要说:这个方法允许你访问 store.customer_number

        4
  •  0
  •   culebrón    16 年前

    代码中有错误,因此无法导入:

    from django.db import models
    class WhatEver(models.Model):
        number = models.IntegerField('Just a Field', default=0)
    

    关于自动递增,Yuval A是对的: . 就用这个 pk id

    > w = Whatever(number=10)
    > w
    <Whatever object>
    > w.id
    None
    > w.save()
    > w.id
    1
    

    [更新]好吧,我还没试过把可调用作为默认值。我想如果你纠正了这些错误,它一定会起作用。