【问题标题】:Python Django - Accessing foreignkey dataPython Django - 访问外键数据
【发布时间】:2014-01-12 04:36:53
【问题描述】:

我试图弄清楚如何从我的模型中获取具有外键关系的数据。我有以下models.py:

class wine(models.Model):
    name = models.CharField(max_length=256)
    year = models.CharField(max_length=4)
    description = models.TextField()

class collection(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField(null=True)

class collection_detail(models.Model):
    collection = models.ForeignKey(collection)
    wine = models.ForeignKey(wine)
    quantity = models.IntegerField()
    price_paid = models.DecimalField(max_digits=5, decimal_places=2)
    value = models.DecimalField(max_digits=5, decimal_places=2)
    bottle_size = models.ForeignKey(bottle_size)

Wine 是一个基本表格,Collection Detail 是一个引用葡萄酒并向其添加用户特定数据(如支付的价格)的表格。 Collection 是一组 collection_detail 对象。

我正在努力研究如何访问这些模型中的数据。我可以轻松地显示来自特定模型的数据,但是在查看特定集合时,我无法访问 collection_detail.wine.name 数据。我需要编写特定的查询来执行此操作吗?我可以从模板语言访问这些数据吗?通过管理员查看时,我的数据模型显示正确,我可以添加我需要的数据和关系。

感谢您的帮助!

【问题讨论】:

  • 一个集合包含许多collection_detail。所以没有一个细节可以访问,而是一个列表。要获取此列表的查询集,请使用 collection.collection_detail_set

标签: python django django-models django-templates django-views


【解决方案1】:

使用collection_detail_set 获取所有collection_detailcollection 的查询集。

如果您想要一对一的关系而不是一对多的关系(这是您使用ForeignKey 得到的),请更改

collection = models.ForeignKey(collection)

collection = models.OneToOneField(collection)

只需从您的collection 模型中调用collection_detail 即可访问collectioncollection_detail

【讨论】:

  • 谢谢大家!使用外壳我尝试了以下操作: mycollections = collection.objects.filter(user=1) #get's only my user's collection mycollection = mycollections.objects.filter(id=1) #grab the first collection 但后来我遇到了麻烦。 .. 我尝试:mydetails = mycollection.collection_detail_set.all() 并出现错误:AttributeError: 'QuerySet' object has no attribute 'collection_detail_set' 有什么想法吗?
  • 另外,我认为我需要一个一对多的关系,因为我需要每个“集合”有很多“collection_detail”对象,对吧?
  • .filter 返回一个 QuerySet(一组模型实例)。如果您有多个具有相同参数的对象(例如数量 = 5),这将很有用。这意味着您必须使用mycollection = mycollections.objects.filter(id=1)[0]。通过主键访问对象的更好方法是使用.get,即mycollection = mycollections.objects.get(pk=1)。这将返回模型实例而不是 QueryObject。
  • 是的 - 如果您需要多个“collection_detail”对象,那么使用一对多关系是正确的。
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2011-07-08
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2015-04-25
  • 2014-03-28
  • 1970-01-01
相关资源
最近更新 更多