Django сериализатор запросов и получение значений внешнего ключа - PullRequest
0 голосов
/ 06 марта 2019

Я хочу получить значение имени пользователя, связанное с полем пользователя в модели TWEET.

Вот две модели, с которыми я работаю:

class Tweet(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    user = models.ForeignKey('USER', models.DO_NOTHING, db_column='USER_ID')  # Field name made lowercase.
    content = models.CharField(db_column='CONTENT', max_length=45)  # Field name made lowercase.
    timestamp = models.DateTimeField(db_column='TIMESTAMP')  # Field name made lowercase.
    like_counter = models.IntegerField(db_column='LIKE_COUNTER')  # Field name made lowercase.
    parent_tweet = models.ForeignKey('self', models.DO_NOTHING, db_column='PARENT_TWEET', blank=True, null=True)  # Field name made lowercase.True

class User(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    username = models.CharField(db_column='USERNAME', max_length=45)  # Field name made lowercase.
    email = models.CharField(db_column='EMAIL', max_length=100)  # Field name made lowercase.
    password = models.CharField(db_column='PASSWORD', max_length=45)  # Field name made lowercase.

функция для сериализации набора запросов:

#returns a queryset of first 5 tweets in order of most recent
tweet_data = Tweet.objects.filter(user_id__in = following_ids).filter().order_by('-timestamp')[:5]
tweet_data_json = serializers.serialize('json', tweet_data, fields=('id','user__username','content','timestamp','like_counter','parent_tweet'))
return tweet_data_json

В serialize () я использую user__username В надежде вернуть имя пользователя, на которое ссылается значение user в таблице твитов, однако это не отображается в моих данных json?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вы можете использовать сериализацию Django Natural Keys для этого процесса. Вам необходимо обновить User модель следующим образом:

class User(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    username = models.CharField(db_column='USERNAME', max_length=45)  # Field name made lowercase.
    email = models.CharField(db_column='EMAIL', max_length=100)  # Field name made lowercase.
    password = models.CharField(db_column='PASSWORD', max_length=45)  # Field name made lowercase.

    def natural_keys(self):
        return self.username

Затем, когда вы вызываете метод serialize, вам нужно установитьuse_natural_foreign_keys как True.Пример:

tweet_data_json = serializers.serialize('json', tweet_data, use_natural_foreign_keys=True, use_natural_primary_key=True)

Для справки вы можете проверить django-natural-keys

0 голосов
/ 06 марта 2019

По умолчанию Django не предоставляет такие значения в сериализаторе. Но вы можете попытаться переопределить его, чтобы получить нужные данные. Например, вы можете переопределить json serializer следующим образом:

from django.core.serializers.json import Serializer

class CustomSerializer(Serializer):

    def end_object(self, obj):
        for field in self.selected_fields:
            if field == 'pk':
                continue
            elif field in self._current.keys():
                continue
            else:
                try:
                    if '__' in field:
                        fields = field.split('__')
                        value = obj
                        for f in fields:
                            value = getattr(value, f)
                        if value != obj:
                            self._current[field] = value
                    else:
                        self._current[field] = getattr(obj,field)

                except AttributeError:
                    pass
        super(CustomSerializer, self).end_object(obj)

Теперь вы можете использовать этот сериализатор следующим образом:

serializers = CustomSerializer()
tweet_data_json = serializers.serialize(tweet_data, fields=('id','user__username','content','timestamp','like_counter','parent_tweet'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...