ForeignKey в поле модели?

Мне нужно отношение foreign key в моей модели с полем username в таблице User (в которой хранится user, созданное с помощью django.contrib.auth.forms.UserCreationForm).

Вот так выглядит моя модель:

class Blog(models.Model):
    username = models.CharField(max_length=200) // this should be a foreign key
    blog_title = models.CharField(max_length=200)
    blog_content = models.TextField()

Поле username должно быть внешним ключом. Внешний ключ должен быть с этим полем


person Anish Silwal    schedule 19.01.2016    source источник


Ответы (2)


У вас не может быть ForeignKey для поля, но вы можете для строки.

Вам нужен username, который доступен через модель User

So:

blog.user.username

Если вы настаиваете на наличии blog.username, вы можете определить такое свойство:

from django.db import models
from django.contrib.auth.models import User

class Blog(models.Model):
    user = models.ForeignKey(User)

Затем для доступа к полю, которое вы хотите использовать:

blog.user.username

Если вы настаиваете на наличии blog.username, вы можете определить такое свойство:

from django.db import models
from django.contrib.auth.models import User

class Blog(models.Model):
    user = models.ForeignKey(User)

    @property
    def username(self):
        return self.user.username

С помощью этого свойства вы можете получить доступ с username по blog.username.

Примечание о том, как импортировать пользователя

user = ForeignKey('auth.User')

or

from django.contrib.auth.models import User
user = ForeignKey(User)

или более рекомендуемый

from django.conf import settings
user = ForeignKey(settings.AUTH_USER_MODEL)
person bakkal    schedule 19.01.2016
comment
именно то, что я хотел. - person Anish Silwal; 19.01.2016
comment
можете ли вы сказать мне, должен ли я также импортировать сюда какие-либо классы. - person Anish Silwal; 19.01.2016
comment
Model и ForeignKey взяты из models Django, которые вы уже импортировали, а декоратор property встроен в Python, так что нет. - person bakkal; 19.01.2016
comment
это User модель, созданная мной. если так, то это не то, что я искал. - person Anish Silwal; 19.01.2016
comment
Это может быть Django или ваша собственная пользовательская модель (в этом случае вы можете использовать settings.AUTH_USER_MODEL для ссылки на нее) - person bakkal; 19.01.2016
comment
Хорошо, спасибо, но не могли бы вы сказать мне разницу в этих трех. или что я ищу в Google, чтобы узнать их. - person Anish Silwal; 19.01.2016
comment
contrib не contirb, там была ошибка, опечатка, и я обновлю ответ, чтобы использовать ее, одну секунду - person bakkal; 19.01.2016
comment
Учитывая, что я думаю, что вы новичок, не забывайте, что вам также необходимо сбросить или перенести базу данных, чтобы внести новые изменения в вашу модель: docs.djangoproject.com/en/1.9/topics/migrations - person bakkal; 19.01.2016

Если я что-то не упустил, у вас может быть внешний ключ для определенного поля:

class Blog(models.Model):
    username = models.ForeignKey(User, to_field='username')

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.to_field

person jthewriter    schedule 21.03.2017
comment
... за исключением того, что поле в to_field должно быть уникальным в таблице. Так что не работает в общем. - person C S; 18.04.2018
comment
@CS Почему ограничение уникальности вообще не работает? Обратите внимание, что вопрос касается поля «ForeignKey to a Model», и, как мы знаем, оно действительно должно быть уникальным, потому что это и есть «ForeignKey», отношение «многие к одному», то есть многие записи из таблицы Blog относятся к одной записи. из пользовательской таблицы. Если связанное поле (имя пользователя) не уникально и говорит, что есть 3 записи с одинаковым значением (например, John123), то будет невозможно связать блог с пользователем, поскольку существует более 1 записи от пользователя с одинаковым значением. значение поля (для имени пользователя) на выбор. - person Niel Godfrey Ponciano; 07.04.2021
comment
@nponcian, вы объясняете мою точку зрения более подробно, чем я, так что спасибо за это. Надеюсь, это прояснит ситуацию для других читателей. - person C S; 07.04.2021