Как я могу сделать, чтобы сериализовать набор запросов с внешними полями? - PullRequest
1 голос
/ 06 июня 2019

У меня проблема, у меня есть две таблицы

class Car(models.Model):
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    year = models.IntegerField(null=False, default=None)
    begin = models.DateTimeField(default=None, blank=True)
class Brand(models.Model):
    name = models.CharField(max_length=64, default=None)

Затем я попытался сериализовать, используя это:

car_query = Car.objects.filter(year=1984)
car_json = serializers.serialize('json', car)
car = json.loads(car_json)

Это работает, но у меня есть только идентификатор записив таблице бренд.То, что я хотел бы иметь, это имя Бренда внутри переменной car.

Я подумал попробовать это:

car_query = Car.objects.filter(year=1984).values('year', 'begin', 'brand__name')

В этом случае у меня есть набор значений Query, а затем, когда я пытаюсьэто:

car_json = serializers.serialize('json', car_query)
car = json.loads(car_json)

Я получил это: {AttributeError}'dict' object has no attribute '_meta', потому что car_query - это не набор запросов, а набор значений, который является проблемой.

Поэтому я пробую это car_json = json.dumps(car_query), но у меня есть некоторое время и датаэто не работает, поэтому я решил попробовать это:

json.dumps(car_query, sort_keys=True, indent=1, cls=DjangoJSONEncoder)

, но это не работает.Это странно, потому что, когда я использую serializers.serialize, дата и время находятся в хорошем формате, но когда я использую json.loads, у меня есть datetime.

Я уточняю, что моя цель - просто иметь в конце переменнуюcar, который содержит все поля таблицы Car и поле name таблицы Brand.

1 Ответ

0 голосов
/ 06 июня 2019

вы можете создать модель метода, чтобы получить название бренда

class Brand(models.Model):
    name = models.CharField(max_length=64, default=None)

class Car(models.Model):
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    year = models.IntegerField(null=False, default=None)
    begin = models.DateTimeField(default=None, blank=True)

    def get_brand(self):
        return self.brand.name

и в serializers.py добавить метод модели в поля

class CarSerializer(serializers.ModelSerializer):

    class Meta:
        model = Car
        fields = [field.name for field in Car._meta.fields]
        fields += ['get_brand']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...