Queryset:在命令(Django)中返回附件的描述



考虑下一个例子:

class Vehicle(models.Model):
    vehicle = models.CharField(_('veículo'), max_length=50, unique=True)
    price = models.DecimalField(_(u'preço'), max_digits=8, decimal_places=2)
    kit_fabric = models.ForeignKey(
        "Kit", verbose_name=u'kit de fábrica', related_name='vehicle_kit')

class Accessory(models.Model):
    accessory = models.CharField(_(u'accessório'), max_length=50)
    price_accessory = models.DecimalField(
        _(u'preço'), max_digits=8, decimal_places=2)

class Kit(models.Model):
    kit = models.CharField(max_length=50)

class KitDetail(models.Model):
    kit = models.ForeignKey("Kit", verbose_name='kit', related_name='kit_det')
    accessory = models.ForeignKey(
        "Accessory", verbose_name=u'accessório', related_name='accessory_kit')
    quantity_accessory = models.PositiveIntegerField(_('quantidade'))
    def __str__(self):
        return str(self.kit)

class Ordered(TimeStampedModel):
    customer = models.ForeignKey("Customer", verbose_name='cliente')
    employee = models.ForeignKey("Employee", verbose_name=u'funcionário')
    vehicle = models.ForeignKey("Vehicle", verbose_name=u'veículo')
    kit_optional = models.ForeignKey("Kit", verbose_name='kit opcional')
    dealership = models.ForeignKey(
        "Dealership", verbose_name=u'concessionária')
    kiosk = models.ForeignKey("Kiosk", verbose_name='quiosque')
    status = models.CharField(max_length=2, choices=status_list, default='p')

如何按订购的配件返回描述?

也就是说,在我的模板中我需要:

{{ object.kit_optional.accessory }}
{{ object.kit_optional.price_accessory }}
{{ object.kit_optional.quantity_accessory }}

否则,我尝试其他代码,但不工作。

我试着

$ ./manage.py shell
>>> from new_way.core.models import Ordered, Customer, KitDetail
>>> ordered.kit_optional.kit_det.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'ordered' is not defined
>>> Ordered.kit_optional.kit_det.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'ReverseSingleRelatedObjectDescriptor' object has no attribute 'kit_det'

But not work.

每个ForeignKey的定义都增加了一个反向关系,该关系可以通过related_name访问(默认为$model_name_lowercase$_set)。因此,您可以使用以下代码来访问所需的对象:

ordered.kit_optional.kit_det.all() # Returns all KitDetail objects, related to oredered.kit_optional

您可以遍历它并为每个KitDetail检索相关的Accessory对象集:

{% for kit_detail in ordered.kit_optional.kit_det.all %}
    {{ kit_detail.quantity_accessory }}
    {% for accessory in kit_detail.accessory_kit.all %}
        {{ accessory.accessory }}
        {{ accessory.price_accessory }}
    {% endfor %}
{% endfor %}

最新更新