Как сделать автоматически заполненное и автоматически увеличивающееся поле в Django admin

[обновление: изменить заголовок вопроса, чтобы быть более конкретным]

Извините, если я не очень хорошо вопрос, я не могу понять как это сделать:

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

Я хочу автоматически написать следующий номер, и я не знаю, как это сделать.

у меня есть ошибки callablefunction заявив, что он не может импортировать модель, и я думаю, что должен быть более простой способ сделать это. В этом нет необходимости. чтобы использовать это, но я не могу понять как это сделать с ПК количество.

я погуглил об этом, и единственное, что я нашел, это использовать метод save() для автоматического увеличения числа... но я хотел показать это в <textfield> перед сохранением...

что бы вы сделали?

4 ответов


понял! Я надеюсь, что это поможет всем, у кого есть какие-либо проблемы с автоматическим заполнением и автоматическим увеличением поля в 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 клиента, то при добавлении следующего поле будет заполнено clientcode кол-133)

Я знаю, что это абсурдно для большинства практических ситуаций, так как номер ПК также автоматически увеличивается, но нет никакого способа автозаполнения или практического использования для него внутри администратора django.

[update: как я уже сказал в своем комментарии, для этого есть способ использовать первичный ключ, но он не будет заполнять поле до экономия]


каждая модель Django уже имеет автоматически сгенерированный первичный ключ:

id = models.AutoField(primary_key=True)

Кажется, вы пытаетесь дублировать уже существующее поведение, просто использовать первичный ключ объекта.


Я тоже наткнулся на эту проблему, мой экземпляр был customer.number который был относительно клиентов Store. Меня так и подмывало сказать что-нибудь вроде:--7-->

# 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() объекты QuerySet)

Что Я в итоге получилось что-то вроде:

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)

PS:

вы несколько раз выкидывали, что хотите, чтобы это поле заполнили "до". Я полагаю, вы хотели, чтобы он был заполнен перед сохранением, чтобы вы могли получить к нему доступ. На это я бы сказал: Этот метод позволяет получить доступ store.customer_number чтобы увидеть следующий номер.


у вас есть ошибки в коде, поэтому вы не можете импортировать его:

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

и Юваль а прав насчет автоматического приращения:вам даже не нужно объявлять такое поле. Просто используйте pk или id, они означают то же самое, если в модели нет составного ПК:

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

[update] Ну, я не пробовал вызываемый по умолчанию. Я думаю, если вы исправите эти ошибки, это должно сработать.