[Обновление: Измененный заголовок вопроса, чтобы быть более конкретен]
Извините, если я не сделал вопрос очень хорошо, я не могу изобразить, как сделать это:
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 числом.
Я погуглил об этом и единственной вещи, которую я нашел, должен был использовать сохранение () метод для автоматического постепенного увеличения числа..., но я хотел показать его в <textfield>
перед сохранением...
Что Вы сделали бы?
Понятно! Надеюсь, это поможет всем, у кого есть проблемы с созданием автоматически заполняемых и автоматически увеличивающихся полей в 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
не принимает никаких аргументов (даже себя) Эта функция автоматически заполнит поле clientcode
следующим числом (т.е. если у вас 132 клиента, когда вы добавите следующий, поле будет заполнен кодом клиента
номер 133)
Я знаю, что это абсурд для большинства практических ситуаций, поскольку номер ПК также увеличивается автоматически, но нет возможности автозаполнения или практического использования для это внутри администратора django.
[обновление: как я сказал в своем комментарии, есть способ использовать для этого первичный ключ, но он не заполнит поле до сохранения]
У вас есть ошибки в коде, поэтому вы не можете его импортировать:
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
[обновление] Ну, я не пробовал использовать вызываемый объект по умолчанию. Я думаю, если вы исправите эти ошибки, это должно сработать.
Каждая модель Django уже имеет автоматически сгенерированный первичный ключ :
id = models.AutoField(primary_key=True)
Похоже, вы пытаетесь дублировать уже существующее поведение, просто используйте первичный ключ объекта.