【问题标题】:Get related cousin model in a template在模板中获取相关表亲模型
【发布时间】:2017-09-22 08:18:13
【问题描述】:

我正在努力寻找如何从表亲相关模型中获取数据的文档或示例。

如果模型看起来像这样:

class Part(models.Model):
    name = models.CharField(max_length=550)

class Quantity(models.Model):
    quantity = models.DecimalField(max_digits=10, decimal_places=2)        
    part = models.ForeignKey('Part', related_name='quantity_part')
    stockarea = models.ForeignKey('StockArea', related_name='quantity_stockarea')

class Stock(models.Model):
    name = models.CharField(max_length=550)

class StockArea(models.Model):
    area = models.CharField(max_length=550)
    stock = models.ManyToManyField(Stock, related_name='stockarea_stock')

    def __str__(self):
        return self.area 

在视图中我得到这样的部分:

def details(request, part_id):
    part = get_object_or_404(Part, pk=part_id)
    context = {
        'part': part,
    }
    return render(request, 'part/details.html', context)

最终模板尝试显示数据:

{% for a in part.quantity_part.all %}
   {{ a.quantity }} pcs
   Find part in area: {{ a.stockarea }} 
   in stock: {{ part.stockarea.stock.name }}
{% endfor %}

您知道我是如何尝试获取股票名称的。我不知道如何能够掌握股票的名称。我从那部分那里有一条路。 零件有一个related_name到名为quantity_park数量模型。在模型 Quantity 中,我与模型 StockArea 有关系。从那里我与模型 Stock 有关系。

非常感谢您的指导 =)

也许我完全是在倒退。也许我一开始就错误地定义了模型。我习惯了 MySQL,所以这对我来说很新。

【问题讨论】:

  • 由于 stock 是您的 stockarea 模型中的多对多字段,您需要遍历 stockarea 中的所有股票以获取它们的名称。像这样的东西:{% for stock in a.stockarea.stock.all %} in stock: {{ stock.name }} {% endfor %}
  • @anupsabraham 你是对的。这可能是我很愚蠢的。一个area当然只与一个stock相关。
  • 那么最好将该字段更改为onetoone或foreignkey。

标签: python django database django-models


【解决方案1】:

这个数据模型最好如下:

from django.db import models


class Unit(models.Model):
    name = models.CharField(max_length=32)
    description = models.TextField()
    abbrev = models.CharField(max_length=7)


class Warehouse(models.Model):
    name = models.CharField(max_length=100)
    address = models.TextField()

class StockArea(models.Model):
    warehouse = models.ForeignKey(Warehouse)
    # Adjust type of these identifiers as necessary
    aisle = models.PositiveIntegerField()
    shelf = models.PositiveIntegerField()

class Part(models.Model):
    name = models.CharField(max_length=550)
    description = models.TextField()

class Stock(models.Model):
    part = models.ForeignKey(Part, related_name='stock')  # Adds a 'stock' attribute to 'Part'
    quantity = models.PositiveIntegerField()
    unit = models.ForeignKey(Unit)
    location = models.ForeignKey(StockArea)

查看代码:

from django.views import generic
from .models import Part

class PartView(generic.DetailView):
    # Pre-fetch related objects. This also illustrates the joins
    queryset = Part.objects.prefetch_related(
        'stock', 'stock__location', 'stock__location__warehouse'
    )
    template_name = 'yourapp/part/detail.html'

模板代码yourapp/part/detail.html:

{% extends "base.html" %}
{% block content %}
    <div class="container-fluid">
        <div class="row">
            <div class="col-xs-12 col-md-8 col-md-offset-2">
                <h1 class="title">{{ part.name }}</h1>
                <p>{{ part.description }}</p>
                <h2>Stock information</h2>
                <div class="container-fluid">
                    {% for stock in part.stock.all %}
                        <div class="row">
                            <div class="col-xs-3">
                                Aisle {{ stock.location.aisle }}, shelf {{ stock.location.shelf }}
                            </div>
                            <div class="col-xs-3 label">
                                Warehouse:
                            </div>
                            <div class="col-xs-6">
                                {{ stock.location.warehouse.name }}
                                <address>
                                    {{ stock.location.warehouse.address }}
                                </address>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-xs-3 label">
                                Available:
                            </div>
                            <div class="col-xs-8 numeric">
                                {{ stock.quantity }}
                            </div>
                            <div class="col-xs-1 unit">
                                {{ stock.unit.abbrev }} <sup><i class="fa fa-icon" title="{{ stock.unit.name }}"></i></sup>
                            </div>
                        </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
{% endblock content %}

编辑

  • 修复了库存/零件的模型关系。
  • 在 cmets 中调整了符合规范的数据模型
  • 添加了视图代码来说明连接并指向prefetch_related
  • 调整模板以匹配更改

【讨论】:

  • 我关注的是StockArea,它实际上是零件所在的现货仓库。像过道2,Bin 5。但我也希望能够获得 Stock.name。
  • 一件物品可以放在仓库的多个位置吗?如果没有,区别是语义上的,您可以简单地向 stock 添加一个 char 字段。
  • 它可以在多个位置。此外,该地点具有示例中排除的特征,我排除了这些特征,因此代码不会变得混乱。例如,我有 max_volume 和 max_load。因此,每个位置都不会被填满,或者货架因为重量而刹车。我习惯了 SQL。像JOIN 这样的东西不应该用这个吗?
  • Django 在幕后自动加入。我将添加小的视图代码,以便您查看和更新​​模型以匹配规格。
猜你喜欢
  • 2012-05-21
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多