django заполнить поле модели из другой модели без ForeignKey - PullRequest
0 голосов
/ 27 мая 2020

Я работаю в приложении, используя выход из нескольких баз данных (я не могу их изменить). Я подключаюсь ко всем из них и могу без проблем выполнять запросы и сериализаторы, но я хочу заполнить поле из модели в другую модель, где они имеют одинаковое значение:

class Cuisines(models.Model):
    name = models.CharField(max_length=255)
    company_id = models.PositiveIntegerField()
    ...

    class Meta:
        managed = False
        db_table = 'cuisines'
        in_db = 'db_2'

class Companies(models.Model):
    company_name = models.CharField(max_length=255)
    location = models.CharField(max_length=255, blank=True, null=True)
    ....
    class Meta:
        managed = False
        db_table = 'cuisines'
        in_db = 'db_1'
        ...

view:

def cuisines(request): 
    companies = Companies.objects.all()
    for company in companies:
        result = Cuisines.objects.filter(company_id = company.id )
        serializer = OrderSerializer(result, many=True)
        return JSONResponse(serializer.data)

результат выглядит:

[{"id":1,"name":"Burger",company_id:"1" ...]

и я ищу:

[{"id":1,"name":"Burger","company_id":"some name", }...]

ОБНОВЛЕНИЕ: сериализатор

class OrderSerializer(serializers.ModelSerializer):

    class Meta:
        model = Cuisines
        fields = ('id','name','company_id')

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Прежде всего вам нужно подключить экземпляры в представлении

def cuisines(request): 
    companies = Companies.objects.all()
    for company in companies:
        result = list(Cuisines.objects.filter(company_id=company.id))
        for o in result:
            setattr(o, 'company', company)
        serializer = OrderSerializer(result, many=True)
        return JSONResponse(serializer.data)

Сериализатор

class OrderSerializer(serializers.ModelSerializer):
    #eg. custom company_name field
    company_name = serializers.CharField(read_only=True, source='company.company_name')

    class Meta:
        model = Cuisines
        fields = ('id','name','company_name')
0 голосов
/ 27 мая 2020

Мне нужно было сделать это в моем последнем проекте, и я создал словарь, в который поместил значения, которые хотел вернуть. Итак, в вашем случае:

result = []
for i in Cusiness.objects.all():
    d = {}
    company = Companies.objects.get(id = i.company_id)
    d["name"] = i.name
    d["company_id"] = company.name
    ...
    result.append(d)
...