Python 了解查询集,创建完美的数据库关系

Python 了解查询集,创建完美的数据库关系,python,django,django-queryset,Python,Django,Django Queryset,我目前正试图找出基于几个模型构造数据库模式的最佳方法。我会尽力解释这一点,以便找出解决问题的最佳方法 首先,我有3个“相关”的模型 用户,它被扩展为包含字段api\u键,活动,最后是信标 用户可以有许多活动,但是活动只能涉及一个用户我的第一个选择是让活动有一个用户的外键,如果我错了,请纠正我,但我觉得这是最好的选择。同样地,活动可以有许多信标,但一个信标一次只能与一个活动相关。再一次,我认为这里的外键将是最好的 当我尝试查询与任何给定的活动相关的信标时,就会出现问题。我希望返回与用户相关的所有信

我目前正试图找出基于几个模型构造数据库模式的最佳方法。我会尽力解释这一点,以便找出解决问题的最佳方法

首先,我有3个“相关”的模型

用户
,它被扩展为包含字段
api\u键
活动
,最后是
信标

用户
可以有许多
活动
,但是
活动
只能涉及一个
用户
我的第一个选择是让
活动
有一个
用户
的外键,如果我错了,请纠正我,但我觉得这是最好的选择。同样地,
活动
可以有许多
信标
,但一个
信标
一次只能与一个
活动
相关。再一次,我认为这里的外键将是最好的

当我尝试查询与任何给定的
活动
相关的
信标时,就会出现问题。我希望返回与
用户
相关的所有
信标
,同时获取
活动
的数据

我希望返回一个JSON字符串,如下所示:

{
    XXXX-YYYYY: {
        message: "Hello World",
        destination: "http://example.com"
    }
    XXXX-YYYYY: {  
        message: "Hello World",
        destination: "http://example.com"
    }
}
XXXX-YYYY是
信标。工厂id
和消息/目的地是
活动。消息和
活动。目的地


我想Queryset在这里,但我以前从未和他们合作过,这让我很困惑

根据你的问题,你有这样的问题:

 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")
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'])
通过使用
campaign\u set
generated属性,您可以:

如果模型具有
外键
,则外键模型的实例将可以访问返回第一个模型的所有实例的管理器。默认情况下,此管理器命名为
FOO\u set
,其中
FOO
是源模型名称,小写

因此,您可以像这样查询您的
信标
模型:

 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")
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'])
对于你的字典来说,不可能做到完全像这样。您不能有重复的密钥。

我希望返回与
用户相关的所有
信标
,同时获取
活动的数据

然后,您可以轻松地将其处理为所需的数据结构

我在想Querysets,但我以前从未和他们合作过,这让我很困惑


QuerySet
就是Django ORM如何表示对数据库的查询,从而生成一组项。因此,上面是一个查询集,就像
User.objects.all()
一样简单。您可以在中阅读一些有关QuerySets的介绍性材料。

太棒了,这完全可以回答问题。关于您最后的评论“对于您的字典,不可能完全像这样。您不能有重复的键。”XXXX-YYYY只是一个占位符,它将是一个由工厂id指定的唯一键,其中没有两个是相同的。@NeilAshleyHickman Ok,我以为你有多个具有相同工厂id的Beacon对象,我的坏:-)我没有澄清,你不知道:)谢谢你提供了这些细节,这确实帮助我现在理解了原理。