Django ForeignKey создать - PullRequest
       6

Django ForeignKey создать

0 голосов
/ 21 сентября 2018

Я хочу назначить много регионов для модели UserProfile, как это сделать?

код

class Region(models.Model):
    name = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now=True)

 class UserProfile(models.Model):

    user = models.OneToOneField(

    region = models.ForeignKey(Region, on_delete=models.CASCADE, null=True, blank=True)

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):
    regions = models.ManyToManyField(Region,related_name='User')

Я думаю, что это идеальный способ реализовать то, что вам нужно.Использование ManyToManyField позволяет сопоставить объект userprofile с несколькими объектами региона и наоборот.

Кроме того, Наследование абстрактного пользователя позволяет добавить поле области в таблицу пользователей Django, что лучше, чем создание другой таблицы для связывания пользователяи поле области.

0 голосов
/ 21 сентября 2018

Вы описываете отношение , а не a ForeignKey, что означает, что UserProfile имеет (максимум) один связанный Region, но ManyToManyField [Django-doc] .

A ManyToManyField, таким образом, означает, что область может быть связана с нулем, одним или несколькими UserProfile s и a UserProfile может относиться к нулю, одному или нескольким Region с.

Таким образом, вы можете изменить модели на:

class Region(models.Model):
    name = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now=True)

 class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    <b>regions</b> = models.<b>ManyToManyField(Region)</b>

В реляционной базе данных это реализуется путем добавлениядополнительный (скрытый) стол с ForeignKey с до Region с и UserProfile с.Но Django ORM работает "прозрачно" и, таким образом, скрывает детали реализации.

См. Документацию для получения дополнительной информации о том, как "заполнить" такое отношение.

...