отношения многие ко многим в модели базы данных Django - PullRequest
0 голосов
/ 04 сентября 2018

Привет, я совершенно новичок в python и впервые внедряю ORM в mysql.

у нас есть три две таблицы и одна промежуточная таблица, как показано на диаграмме ниже many to many relationship

ниже приведен код, который мы используем для создания моделей

class Roles(models.Model):
    """
    A class that stores all the types of roles that are available to the user
    """
    role_id = models.CharField(max_length=200, blank=False,primary_key=True)
    role_name = models.CharField(max_length=200)

    class Meta:
        db_table = 'roles'
        managed = False


class User(AbstractBaseUser):
# class ChannelUser(models.Model):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    """
    user_id = models.CharField(max_length=200, blank=False,primary_key=True)
    user_email = models.EmailField(max_length=200, blank=False, unique=True)
    roles=models.ManyToManyField(
        Roles,
        through='UserRole',
        # through_fields=('user_id', 'role_id'),
    )

    USERNAME_FIELD = 'user_email'

    class Meta:
        db_table = 'user'
        managed = False

class UserRole(models.Model):
    """
    A class that stores user ids and role ids
    """
    user = models.ForeignKey(User, on_delete=models.PROTECT, db_column='user_id')
    role = models.ForeignKey(Roles, on_delete=models.PROTECT, db_column='role_id') 
    timestamp = models.DateTimeField(default=timezone.now)   

    class Meta:
        db_table = 'user_roles'
        managed = False

Мы пытаемся получить все Roles, связанные с User, но это дает None для roles.

Я не уверен, что мы здесь делаем неправильно. Может кто-нибудь, пожалуйста, укажите это.

Ниже приведен код, который я использую для получения ролей

user_detail = User.objects.get(user_email=username)
print(user_detail.user_email)  //prints user email
print(user_detail.roles) // prints Roles.None

settings.py

AUTH_USER_MODEL = "login_api.User"

1 Ответ

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

При доступе к конкретному экземпляру модели (а не к менеджеру модели) вы получаете доступ к связанным элементам с помощью modelname_set вместо modelname. Например:

>>> user_detail.roles_set.remove(my_role)
>>> user_detail.roles_set.all()
<QuerySet []>

Docs:

https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/

...