我目前正在尝试找出基于少数模型构建数据库架构的最佳方法。我会尽力解释这个问题,以便找到解决问题的最佳方法。
首先,我有3个与#34;相关的模型"
User
扩展为包含字段api_key
,Campaign
和最后Beacon
。
User
可以有多个Campaign
,但Campaign
只能与一个User
相关,我的第一选择就是Campaign
有User
的外键,如果我错了,请纠正我,但我觉得那是最好的选择。同样,Campaign
可以包含多个Beacon
,但Beacon
一次只能与一个Campaign
相关联。我再次假设这里的外键可以发挥最佳效果。
当我尝试查询与任何给定Beacon
相关的Campaign
时,会出现此问题。我希望返回与Beacon
相关的所有User
,同时获取Campaign
的数据。
我希望返回如下的JSON字符串:
{
XXXX-YYYYY: {
message: "Hello World",
destination: "http://example.com"
}
XXXX-YYYYY: {
message: "Hello World",
destination: "http://example.com"
}
}
XXXX-YYYYY为Beacon.factory_id
且邮件/目的地为Campaign.message
和Campaign.destination
我认为Queryset在这里,但我之前从未与他们合作过,这让我很困惑。
答案 0 :(得分:2)
根据你的问题,你有这样的事情:
class User(models.Model):
pass
class Campaign(models.Model):
user = models.ForeignKey(User, verbose_name="Attached to")
message = models.CharField()
destination = models.CharField()
class Beacon(models.Model):
factory_id = models.CharField()
campaign = models.ForeignKey(Campaign, verbose_name="Campaign")
您可以follow ForeignKey
"backward"使用campaign_set
生成的属性:
如果模型具有
ForeignKey
,则外键模型的实例将可以访问返回第一个模型的所有实例的管理器。默认情况下,此管理器的名称为FOO_set
,,其中FOO
是源型号名称,小写。
因此,您可以像这样查询Beacon
模型:
beacon = Beacon.objects.get(factory_id="XXXX-YYYYY")
# Get every campaigns related and only relevant fields (in a list of dict)
campaigns = beacon.campaign_set.all().values('message', 'destination')
for campaign in campaigns:
print(campaign['message'])
print(campaign['destination'])
对于你的字典,不可能完全像这样。您不能拥有重复的密钥。
答案 1 :(得分:0)
我希望返回与Beacons
相关的所有User
,同时获取Campaign
的数据
beacons = Beacon.objects.filter(campaign__user=user).select_related('campaign')
然后,您可以轻松地将其处理为所需的数据结构。
我在这里思考Querysets,但我之前从未与他们合作,只是让我困惑
QuerySet
就是Django ORM如何表示对数据库的查询,这会产生一组项目。所以上面是一个QuerySet,就像User.objects.all()
一样简单。您可以在the documentation中阅读有关QuerySet的一些介绍性资料。