Django User as foreignKey имеет странное поведение

Я создаю restful API в Django и заметил кое-что довольно странное! Вот моя модель темы:

class Topic(models.Model):
    """ Topic base model"""
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150, blank=False, null=False)
    content = models.CharField(max_length=500, blank=False, null=False)
    date_added = models.DateTimeField(auto_now_add=True, editable=False)

    def __str__(self):
        return self.title

А это мой сериализатор:

class TopicSerializer(serializers.ModelSerializer):
    """Serializer for the Topic model"""
    user = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Topic
        exclude = ['owner']
        extra_kwargs = {'pk': {'read_only': True}, 'owner': {'read_only': True}}

Как вы можете видеть, владелец исключен, но когда я делаю get-запрос /api/topics/1/ на моем Topic ModelViewSet, я получаю:

{"id":1,"user":"Javad","title":"a","content":"b","date_added":"2024-08-25T19:57:00.712475Z"}

А когда я включаю владельца в свой сериализатор, то получаю:

{"id":1,"user":"Javad","title":"a","content":"b","date_added":"2024-08-25T19:57:00.712475Z","owner":"90f8d3d9-08c2-4890-9ba6-3e6f912b10ee"}

Так почему же именно Django добавляет поле "user" в мою модель?

Я полагаю, что это должно быть намеренно и уникально для пользователя Model, верно? Могу ли я контролировать это?

Так почему же именно Django добавляет поле "пользователь" в мою модель?

Потому что вы просите сериализатор сделать это. Вы определили a:

user = serializers.ReadOnlyField(source='owner.username')

Вы можете удалить это с помощью:

class TopicSerializer(serializers.ModelSerializer):
    #   🖟 remove
    # user = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Topic
        exclude = ['owner']
        extra_kwargs = {'pk': {'read_only': True}, 'owner': {'read_only': True}}

Если вы хотите, чтобы в поле указывалось имя пользователя, вы работаете с:

class TopicSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Topic
        exclude = ['owner']
        extra_kwargs = {'pk': {'read_only': True}, 'owner': {'read_only': True}}
Вернуться на верх