Как сделать автоматически заполненное и автоматически увеличивающееся поле в 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
, в которых указано, что он не может импортировать модель, и я думаю, что должен быть более простой способ сделать это. Нет необходимости даже использовать это, но я не могу понять, как это сделать с номером pk.
Я искал эту информацию, и единственное, что я нашел, это использовать метод save() для автоматического увеличения числа... но я хотел показать его в <textfield>
перед сохранением...
Что бы вы сделали?
Ответы
Ответ 1
Получил это!. Надеюсь, это поможет всем, у кого возникнут проблемы с созданием автоматически заполняемого и автоматически увеличивающегося поля в 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)
Я знаю, что это абсурдно для большинства практических ситуаций, поскольку номер PK также автоматически увеличивается, но нет возможности автозаполнения или практического использования для него внутри администратора django.
[update: как я сказал в своем комментарии, есть способ использовать первичный ключ для этого, но он не заполнит поле до)
Ответ 2
Каждая модель Django уже имеет автоматически сгенерированный первичный ключ:
id = models.AutoField(primary_key=True)
Кажется, вы пытаетесь дублировать уже существующее поведение, просто используйте первичный ключ объекта.
Ответ 3
Я тоже столкнулся с этой проблемой, мой экземпляр которой был 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)
PS:
Вы несколько раз выкидывали, что вы хотели, чтобы это поле заполнялось "раньше". Я думаю, вы хотели, чтобы он был заполнен до сохранения, чтобы вы могли получить к нему доступ. К этому я бы сказал: этот метод позволяет вам получить доступ к store.customer_number
, чтобы увидеть следующее число.
Ответ 4
У вас есть ошибки в коде, поэтому его нельзя импортировать:
from django.db import models
class WhatEver(models.Model):
number = models.IntegerField('Just a Field', default=0)
и Юваль А прав об автоинкрементах: вам даже не нужно объявлять такое поле. Просто используйте pk
или id
, они означают то же самое, если в модели нет составного pk:
> w = Whatever(number=10)
> w
<Whatever object>
> w.id
None
> w.save()
> w.id
1
[update] Ну, я не пробовал использовать как по умолчанию. Я думаю, что если вы исправите эти ошибки, он должен работать.