Получить данные из двух таблиц с использованием внешнего ключа в Django

Обновить

April 2019

Просмотры

407 раз

1

У меня есть таблица поставщиков он имеет следующую структуру:

id  vendor_name

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

id  product_id   us er_id   vendor_id

Тогда есть AUTH_USER таблица по умолчанию, который имеет адрес электронной почты пользователей, first_name, last_name и т.д.

Мне нужно создать API в классе Джанго на основе, так что я могу получить пользователей электронной почты, first_name, last_name и т.д. на основе VENDOR_ID колонке, которая находится в таблице покупки, когда я использую GET / поставщика / {VENDOR_ID}

Примечание: Мне нужно это API должен быть создан в классе на основе модели и вид:

Мой код:

model.py

class Vendor(models.Models):
    vendor_name = models.CharField(max_length=25)

    class Meta:
        ordering = ('vendor_name',)
    def __str__(self):
        return self.vendor_name

class Purchases(models.Models):
    user = models.OneToOneFiled(User, on_delete=models.CASECADE)
    product_id = models.ForeignKey('Product', on_delete=models.SET_NULL, null=True, blank=True)
    vendor_id = models.ForeignKey('Vendor', on_delete=models.SET_NULL, null=True, blank=True)

    def __str__(self):
        return self.vendor_id

views.py

class VendorDetail(generics.RetrieveUpdateDestoryAPIView):
    queryset= Vendor.objects.all()
    serializer_class = VendorSerializer
    name = 'vendor-details'

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

{
  "id": 1,
  "name": "group-1"
  "users": [
    {
      "id": 1,
      "email": "[email protected]",
      "first_name": "myfirstname1",
      "last_name": "mylastname1"    },
    {
      "id": 2,
      "email": "[email protected]",
      "first_name": "myfirstname2",
      "last_name": "mylastname2"
    }
  ],
}

1 ответы

0

you can get all data by using values In your Purchases model change vendor_id line like this;

vendor_id = models.ForeignKey('Vendor', on_delete=models.SET_NULL, null=True, blank=True, related_name='vendor_purchases')

And then you can get all data like this; NOTE if you do not use prefetch_related in for loop it access database for each user but now for all data it access database only 3 times

vendor = Vendor.objects.get(pk=vendor_id).prefetch_related(vendor_purchases).prefetch_related(vendor_purchases__user)

user_list = []

for purchase in vendor.vendor_purchases.all():
    purchase_user = {}
    purchase_user["id"] = purchase.user.pk
    purchase_user["email"] = purchase.user.email
    purchase_user["first_name"] = purchase.user.first_name
    purchase_user["last_name"] = purchase.user.last_name
    user_list.append(purchase_user)

result={}
result["id"] = vendor.pk
result["name"] = vendor.name
result["users"] = user_list

Связанные вопросы