dosya97
@dosya97
Fullstack web-developer

Возможно ли связать две модели «дуплексно»?

Здравствуйте, делаю интранет систему для знакомых. Возникла проблема при создании групп и при привязке пользователей в группы. Допустим у нас есть пользователи(Ученики). И есть группы. Через панель администратора нужно добавлять пользователей(models.User) -> созданную группу.(models.SomeGroup).
Внутри группы создал поле students ManyToManyField с привязкой на модель User.
Вроде все работает но хотелось бы чтобы в User панели отображалось где именно человек есть. Как такое можно такое реализовать? Вот коды:
Это модель профайл юзера
class Profile(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    birth=models.DateField(null=True)
    degree = models.CharField(max_length = 2,choices=DEGREE_CHOICE,default='B')
    #image=models.ImageField(verbose_name="Image",null=True)
    phone=models.CharField(max_length = 12,null=True)
    image=models.ImageField(null=True,blank=True,
                            upload_to=upload_location,
                            height_field="height_field",
                            width_field="width_field",)
    height_field = models.IntegerField(default=0,null=True,blank=True)
    width_field = models.IntegerField(default=0,null=True,blank=True)
    course = models.CharField(max_length=2,choices=COURSE_CHOICE,default='FB')
    start = models.DateField(null=True,blank=True)
    ended = models.DateField(null=True,blank=True)
    lessons = models.IntegerField(default=0)
    left = models.IntegerField(default=0)
    group = models.ForeignKey(IELTSGroup,blank=True,null=True)

Это модель группы
class IELTSGroup(models.Model):
    name = models.CharField(max_length=50,null=False,unique=True)
    teacher = models.ForeignKey(User,limit_choices_to={'is_staff': True},related_name="teacher",null=False,default=0)
    description = models.TextField(null=True,blank=True)
    students = models.ManyToManyField(User,limit_choices_to={'is_staff': False}, related_name="students",blank=True)
    created = models.DateTimeField(default=timezone.now)
    start = models.DateField(null=True,blank=True)

Пожалуйста нужна помощь. Спасибо.
Вот скрины
73dcc3709eec415aab94d1a16caf271f.png
8c25ef8a741340fb840038b776f9bd64.png
  • Вопрос задан
  • 541 просмотр
Пригласить эксперта
Ответы на вопрос 2
@arctblake
Перепишите related_name на user_groups. Students - это со стороны группы, а со стороны юзера - user_groups.

Если сделать как ниже, то группы будут показываться на странице list view, то есть на той стр, где список всех юзеров. А вообще лучше привязывать группы к профилям

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    
    list_display = (..., 'groups') # тут перечисляете все поля, которые должны показываться + в конец добавляете groups

    def groups(self, user):
        return ', '.join(user.user_groups.values_list('name', flat=True))

    groups.short_description = 'groups'
Ответ написан
dosya97
@dosya97 Автор вопроса
Fullstack web-developer
Adminка профайла
class UserProfileInline(admin.StackedInline):
    model = Profile
    #TabularInline
    list_display = ('groups')
#
# # @admin.register(User)
class UserAdmin(DjangoUserAdmin):
    inlines = (UserProfileInline,)
    def groups(self, user):
        return ', '.join(user.user_groups.values_list('name', flat=True))

    groups.short_description = 'groups'
class ActivateAdmin(admin.ModelAdmin):
    model = Activate
    list_display = ('user','hash','assigned_date')

admin.site.register(Activate, ActivateAdmin)



admin.site.unregister(User)
admin.site.register(User, UserAdmin)

Модель профайла
class Profile(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    birth=models.DateField(null=True)
    degree = models.CharField(max_length = 2,choices=DEGREE_CHOICE,default='B')
    #image=models.ImageField(verbose_name="Image",null=True)
    phone=models.CharField(max_length = 12,null=True)
    image=models.ImageField(null=True,blank=True,
                            upload_to=upload_location,
                            height_field="height_field",
                            width_field="width_field",)
    height_field = models.IntegerField(default=0,null=True,blank=True)
    width_field = models.IntegerField(default=0,null=True,blank=True)
    course = models.CharField(max_length=2,choices=COURSE_CHOICE,default='FB')
    start = models.DateField(null=True,blank=True)
    ended = models.DateField(null=True,blank=True)
    lessons = models.IntegerField(default=0)
    left = models.IntegerField(default=0)
    # groups = models.ForeignKey(IELTSGroup,blank=True,null=True)
    groups = models.ManyToManyField(IELTSGroup, related_name="user_groups",blank=True)

Модель Группы
class IELTSGroup(models.Model):
    name = models.CharField(max_length=50,null=False,unique=True)
    teacher = models.ForeignKey(User,limit_choices_to={'is_staff': True},related_name="teacher",null=False,default=0)
    description = models.TextField(null=True,blank=True)
    students = models.ManyToManyField(User,limit_choices_to={'is_staff': False}, related_name="user_groups",blank=True)
    created = models.DateTimeField(default=timezone.now)
    start = models.DateField(null=True,blank=True)
    #dayOfTheWeek = DayOfTheWeekField(null=True,blank=True)

    def __str__(self):
        return self.name + " - " + self.teacher.username
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы