了解Querysets,创建完美的数据库关系

时间:2014-05-24 12:00:57

标签: python django django-queryset

我目前正在尝试找出基于少数模型构建数据库架构的最佳方法。我会尽力解释这个问题,以便找到解决问题的最佳方法。

首先,我有3个与#34;相关的模型"

User扩展为包含字段api_keyCampaign和最后Beacon

User可以有多个Campaign,但Campaign只能与一个User相关,我的第一选择就是CampaignUser的外键,如果我错了,请纠正我,但我觉得那是最好的选择。同样,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.messageCampaign.destination

我认为Queryset在这里,但我之前从未与他们合作过,这让我很困惑。

2 个答案:

答案 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的一些介绍性资料。