簡體   English   中英

無法使用 Django 中的外鍵訪問相關的 model 數據

[英]Not able to access related model data using foreign key in Django

模型.py

class products(models.Model):
    name = models.CharField(max_length=100)
    sku = models.CharField(max_length=50)
    vendor = models.CharField(max_length=50)
    brand = models.CharField(max_length=50)
    price = models.FloatField()
    product_status = models.BooleanField()
    quantity = models.IntegerField()

    def __str__(self):
        return self.name


# categories
class categories(models.Model):
    category_name = models.CharField(max_length=50)
    parent_id = models.IntegerField()


# product categories
class product_categories(models.Model):
    product = models.ForeignKey(products, on_delete=models.CASCADE)
    category = models.ForeignKey(categories, on_delete=models.CASCADE)

    def __str__(self):
        return self.category
  1. 我可以使用訪問“類別”表數據(在 django 外殼內)
data = products.objects.all()
data.values('product_categories__category__category_name')
output: <QuerySet [{'product_categories__category__category_name': 'xxxx'}}]>
  1. 如果我把這個(在 django 外殼內)
data.product_categories.category
output: 'QuerySet' object has no attribute 'product_categories'

如何獲得一個查詢集(可以傳遞給 html),其中包括來自“類別”表的數據以及“產品”表的數據

這里發生了幾個問題。 首先, data是一個查詢集,它有點像一個對象列表,盡管列表中只有一個 object。 您想要的是從列表中的項目中獲取一個屬性,因此您需要類似data.first()的東西來獲取該 object ,然后再開始添加它的屬性。

其次,Django 處理反向 FK 關系的方式要求您通過標准名稱(在您的情況下為product_categories_set )引用 FK,或者您在 FK 上設置自己的related_name屬性。 就像是:

# product categories
class product_categories(models.Model):
    product = models.ForeignKey(products, on_delete=models.CASCADE, related_name='product_categories')
    category = models.ForeignKey(categories, on_delete=models.CASCADE, related_name='product_categories')

    def __str__(self):
        return self.category

這樣您就可以僅使用data.product_categories從產品和類別中引用您的 product_categories model 。

第三,當訪問反向FK關系時,就像上面第(1)點一樣,你會得到一個相關的manager,從中你可以得到一個queryset of items。 因此,要獲取類別名稱,您需要指明您想要類別名稱的項目。 假設它只是所有東西的第一項,它看起來像:

data = products.objects.all()
product_category = data.product_categories.all()
category_name = product_category.category.category_name

當然,一旦您擁有更多數據,您不會總是只想選擇第一個項目,因此您需要在查詢中添加過濾邏輯以確保您獲得所需的項目。

ETA,我同意上面 Jorge 的評論 - MTM 會使這更簡單一些,並且本質上會為您創建您的 product_categories 表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM