#django #django-models
#django #django-модели
Вопрос:
Я работаю над проектом Django, где мне нужно связать одну таблицу (модель) с каждым пользователем. Предположим, что MyTable_1 сопоставляется с user_1 и так далее.
Первичным ключом для MyTable будет поле даты, которое содержит непрерывные даты с момента регистрации пользователя.
MyTable_1 for User_1
|-----------|----------|-------------|-----------------|
| Date(PK) | food_ate | game_played | ran_today |
|-----------|----------|-------------|-----------------|
| 10/01/20 | rice | chess | Yes |
|-----------|----------|-------------|-----------------|
| 11/01/20 |sandwhich | tennis | No |
|-----------|----------|-------------|-----------------|
MyTable_2 for User_2
|-----------|----------|-------------|-----------------|
| Date(PK) | food_ate | game_played | ran_today |
|-----------|----------|-------------|-----------------|
| 16/03/19 | pizza | rugby | Yes |
|-----------|----------|-------------|-----------------|
| 17/03/19 | pasta | football | Yes |
|-----------|----------|-------------|-----------------|
And so on for every new user created. User logs in those information in MyTable.
Как я могу это реализовать? Я использую PostgreSQL и написал пользовательскую модель пользователя.
Ответ №1:
Вам действительно не нужны отдельные таблицы, просто отдельные строки.
Отношение ForeignKey сделает свое дело, что-то вроде этого в вашем models.py:
# user model:
User(models.Model, ...):
first_name = models.CharField(...)
last_name = models.CharField(...)
...
# log model:
Log(models.Model):
user = models.ForeignKey(User, ...)
date = models.DateField(...)
food_ate = models.CharField(...)
game_played = models.CharField(...)
ran_today = models.CharField(...)
class Meta: unique_together = ('user', 'date',)
Затем в другом месте вы можете получить доступ к журналам ваших пользователей следующим образом:
user = User.objects.get(id='the_user_id')
logs = user.logs.all()
Комментарии:
1. Я подумал об этом. Разве это не просто создало бы 1 строку для каждого пользователя в таблице «Log»? Но как мне сохранить информацию по дате?
2. Я добавил поле даты, вы можете добавить метакласс, чтобы гарантировать наличие только одной комбинации даты и пользователя для каждого журнала. Внешний ключ в модели журнала означает, что у одного пользователя может быть много журналов, но у каждого журнала может быть только один пользователь.
3. Хорошо, понял! Итак, что будет делать Django, это создавать новую таблицу для каждой даты, верно? А что, если мои данные растут в течение многих лет. Разве это не повлияет на производительность?
4. Это все еще одна таблица для модели «журнала», но если это поможет, вы, безусловно, можете думать о ней как об отдельных таблицах. И короткий ответ: да, это повлияет на производительность, но при правильной инфраструктуре вам никогда не нужно беспокоиться об этом.
5. Я изучал опцию «unique_together». На уровне базы данных это было бы слишком сложно для многих пользователей в течение длительного времени. Возможно ли создать одну таблицу для пользователя?