Настройка первичных ключей модели
У меня есть модель Mail, которая сохраняет объект почты. Модель почты также имеет поле отношения OneToMany, которое связано с User (Пользователь может иметь много писем, но у письма может быть только один владелец (объект User)). Мне нужно реализовать собственную систему ссылок на первичные ключи для каждого объекта Mail, потому что каждое письмо должно быть связано только с одним пользователем, чтобы правильно отображать урлы.
Например, если Пользователь-1 отправляет свои первые два письма во всем приложении, они сохраняются в базе данных с идентификаторами 1 и 2 id, это стандартная система сохранения первичных ключей django. Затем, если Пользователь-2 отправляет свое первое письмо, это письмо должно быть сохранено с id 1, потому что это первое письмо Пользователя-2, но оно будет сохранено с id 3, потому что по умолчанию система ссылок на первичные ключи, id уже заняты 1 и 2. И в этом проблема, потому что url первого письма для пользователя-2 будет отображаться как /sent-mail/3, тогда как должен быть /sent-mail/1
Итак, как настроить модель Mail и реализовать в ней собственные ссылки на первичный ключ для каждого пользователя.
Вот модель:
class Mail(models.Model):
url_id = None
title = models.CharField(max_length=64)
body = models.CharField(max_length=1000)
unvisited = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
to_user = models.ForeignKey(User, related_name="ToUser", on_delete=models.SET_NULL, null=True)
from_user = models.ForeignKey(User, related_name="FromUser", on_delete=models.SET_NULL, null=True)
from_user_inf = models.CharField(max_length=30)
to_user_inf = models.CharField(max_length=30)
Вы не можете сделать это. Первичные ключи уникальны по своей природе. Вы хотите либо подсчитывать письма, либо отмечать их при отправке.
def get_next_id_in_sent_mail_sequence(mail):
...
class Mail(Model):
mail_id_per_user = IntegerField(default=get_next_id_in_sent_mail_sequence)
...
И вместо запроса по id запросить их по mail_id_per_user.
Но лично для меня это не такая уж важная функция