Привязка одной таблицы к каждому пользователю в Django

#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». На уровне базы данных это было бы слишком сложно для многих пользователей в течение длительного времени. Возможно ли создать одну таблицу для пользователя?