gpt4 book ai didi

python - 在单个 Django 查询中执行查找和更新

转载 作者:行者123 更新时间:2023-11-29 12:24:39 25 4
gpt4 key购买 nike

我有两个模型:MetaModelRelatedModel。我想在 MetaModel 查询中包含 RelatedModel 查找的结果,并且我想在单个数据库调用中执行此操作。

我试图定义一个“子查询”QuerySet 用于主查询,但这没有用 - 它仍在进行两个查询以完成操作。

注意:我不能使用传统的 ForeignKey 关系,因为 profile_id 字段不是唯一的。唯一性是 profile_idchannel 的组合。这是一个汇总表,不保证 profile_id 在多个第三方 channel 中是唯一的。

有什么建议吗?

模型:

class Channel(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(
max_length=25,
)

class MetaModel(models.Model):
profile_id = fields.IntegerField()
channel = fields.ForeignKey(Channel))
metadata = fields.TextField()

class RelatedModel(models.Model):
related_id = fields.IntegerField()
profile_id = fields.IntegerField()
channel = fields.ForeignKey(Channel))

虚拟数据

channel = Channel("Web site A")
channel.save()

sample_meta = MetaModel(profile_id=1234, channel=channel)
sample_related = RelatedModel(profile_id=1234, related_id=5678, channel=channel)

查询:

# Create a queryset to filter down to the single record we need the `profile_id` for
# I've limited to the only field we need via a `values` operation
related_qs = RelatedAccount.objects.filter(
related_id=5678,
channel=channel
).values_list("profile_id", flat=True)

# I'm doing an update_or_create as there is other data to store, not included for brevity
obj, created = MetaModel.objects.update_or_create(
profile_id=related_qs.first(), # <<< This var is the dynamic part of the query
channel=channel,
defaults={"metadata": "Metadata is added to a new or existing record."}
)

最佳答案

关于您关于唯一性的说明,您可以在 Django 中使用 unique_together 选项,如 documentation 中所述.

class MetaModel(models.Model):
profile_id = fields.ForeignKey(RelatedModel)
channel = fields.ForeignKey(Channel)
metadata = fields.TextField()

class Meta:
unique_together = ('profile_id', 'channel')

然后您可以相应地更改您的查询,应该可以解决您的问题。

关于python - 在单个 Django 查询中执行查找和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com