Как добавить поле с его данными из одной модели в другую в Django?

В Django уже есть модель User, которая имеет поле username; у меня также есть модель Profile. Я хочу передать имя пользователя из модели User вместе с полями модели Profile, чтобы я мог получить доступ к имени пользователя из самой модели Profile, так как на фронтенде я возвращаю объект модели Profile

МОДЕЛИ

User= get_user_model()


class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    id_user = models.IntegerField()
    department= models.CharField(max_length=50,blank=True)
    degree= models.CharField(max_length=20,blank=True)
    year= models.CharField(max_length=20,blank=True)
    bio = models.TextField(blank=True)
    profileimg= models.TextField(default=DEFAULT_IMAGE_DATA)
    
    def __str__(self):
        return self.user.username

SERIALIZER

class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields=['id','user', 'id_user', 'department', 'degree', 'year', 'bio','profileimg']


class ChatMsgSerializer(serializers.ModelSerializer):
    reciever_profile= ProfileSerializer(read_only=True)
    sender_profile= ProfileSerializer(read_only=True)
    class Meta:
        model = ChatMsg
        fields=['id','user', 'sender','sender_profile', 'reciever','reciever_profile', 'msg', 'is_read', 'date']

Одним из решений, о котором я думал, было сделать еще один запрос fetch из frontend и сделать еще одну конечную точку, которая возвращает имя пользователя, но не думаю, что это будет хорошо работать, когда мне нужно имя пользователя и отправителя, и получателя

Вы можете использовать SlugRelatedField [drf-doc]:

class ProfileSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(slug_field='username', read_only=True)

    class Meta:
        model = Profile
        fields = [
            'id',
            'user',
            'id_user',
            'department',
            'degree',
            'year',
            'bio',
            'profileimg',
        ]

Проблема с вашим решением

Вам не нужно настраивать фреймворк. Используйте мощный фреймворк django!

Джангоновское решение

Вы можете получить доступ ко всем user атрибутам из Profile записи напрямую! Чтобы получить last_name пользователя из Profile записи с именем some_profile:

  • в Python: some_profile.user.last_name (django docs)
  • в запросах: some_profile__user__last_name (django docs)
  • в HTML: {{ some_profile.user.last_name }}

Рекомендация

Одна рекомендация, вместо ForeignKey используйте OneToOneField (django docs). Это похоже на ForeignKey с unique=True, что имеет смысл в данном случае, поскольку user может быть связано только с уникальным Profile.

class Expert(models.Model):
    # Use 'OneToOneField' instead of ForeignKey
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
    # The rest is unchanged
Вернуться на верх