Есть ли способ выбрать указанные c поля из модели в django? - PullRequest
1 голос
/ 08 апреля 2020

Есть ли способ выбрать некоторые конкретные c поля из модели с внешним ключом. Вот пример: скажем, у меня есть

class Product(models.Model):
    CATEGORY = (
            ('A', 'A'),
            ('B', 'B'),
            ('C', 'C'),
            )
    name = models.CharField(max_length=200, null=True)
    price = models.FloatField(null=True)
    category = models.CharField(max_length=200, null=True, choices=CATEGORY)
    description = models.CharField(max_length=200, null=True)
    date_created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.name

class Order(models.Model):
    STATUS = (
            ('Work Under Progress', 'Work Under Progress'),
            ('Delivered', 'Delivered'),
            )

    product = models.ForeignKey(Product, null=True, on_delete=models.SET_NULL)
    date_created = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=200, null=True, 
        choices=STATUS) 
    def __str__(self):
        return self.product.name

Цель состоит в том, чтобы получить название продукта и цену продукта в классе Order. Есть ли способ сделать это? (Я очень новичок в Django и могу найти именно это в do c)

Спасибо

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Да, вы можете запросить, например, с помощью:

from django.db.models import F

orders = Order.objects.annotate(
    product_name=F('product__name'),
    product_price=F('product_price')
)

Объекты Order, которые возникают из этого набора запросов, будут иметь два дополнительных атрибута .product_name и .product_price который содержит name и price связанных Product.

В самом объекте Order вы можете просто использовать self.product.name. Вы уже делаете это, например, в методе __str__. Например, вы можете получить name и price соответствующего product с помощью:

class Order(models.Model):
    STATUS = (
            ('Work Under Progress', 'Work Under Progress'),
            ('Delivered', 'Delivered'),
            )

    product = models.ForeignKey(Product, null=True, on_delete=models.SET_NULL)
    date_created = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=200, null=True, 
        choices=STATUS) 
    def __str__(self):
        if self.product_id is not None:
            return '{}: {}'.format(self.<b>product.name</b>, self<b>.product.price</b>)
        else:
            return 'no_product'
0 голосов
/ 13 апреля 2020

Я нашел здесь нечто похожее

Django ForeignKey limit_choices_to другой идентификатор ForeignKey

Я реализую это решение и посмотрю, работает ли оно для меня

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