Как использовать пользователя в качестве ForeignKey в модели Django - PullRequest
1 голос
/ 28 мая 2020

У меня есть эта модель в моем приложении Django:

class ClubSession(models.Model):
    location = models.CharField(max_length=200)
    coach = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    date = models.DateTimeField(default=now)
    details = models.TextField()

    def __str__(self):
        return self.title

Я могу запустить python manage.py makemigrations club_sessions без проблем, но когда я запускаю python manage.py migrate club_sessions, я получаю ValueError: Field 'id' expected a number but got 'username'. username является суперпользователем и уже существует.

Как решить эту проблему?

Это последняя миграция:

# Generated by Django 3.0.6 on 2020-05-28 15:07

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('club_sessions', '0004_auto_20200528_1450'),
    ]

    operations = [
        migrations.AlterField(
            model_name='clubsession',
            name='coach',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
        ),
        migrations.AlterField(
            model_name='clubsession',
            name='location',
            field=models.CharField(max_length=200),
        ),
    ]

1 Ответ

1 голос
/ 28 мая 2020

По умолчанию Django позволяет ForeignKey ссылаться на первичный ключ целевой модели. Это также имеет некоторые преимущества, позволяющие сделать отношения более однородными.

Если вы действительно хотите сохранить username в ForeignKey, вы можете указать параметр to_field=… [Django -doc] и пусть он ссылается на уникальный столбец (username модели по умолчанию User уникален), поэтому мы можем ссылаться на него с помощью:

from django.conf import settings

class ClubSession(models.Model):
    location = models.CharField(max_length=200)
    coach = models.ForeignKey(
        <b>settings.AUTH_USER_MODEL</b>,
        on_delete=models.CASCADE,
        <b>to_field='username'</b>
    )
    date = models.DateTimeField(default=now)
    details = models.TextField()

    def __str__(self):
        return self.title

Вам нужно будет удалить уже существующую миграцию и сделать новую, чтобы правильно выполнить миграцию базы данных.

Примечание : Обычно лучше использовать settings.AUTH_USER_MODEL [Django -doc] для обозначения модели пользователя, чем для использования модели User [Django -doc] напрямую. Для получения дополнительной информации вы можете увидеть , относящийся к User модели раздел документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...