gpt4 book ai didi

python - 为什么 models.ForeignKey 有优势?

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:05 25 4
gpt4 key购买 nike

在我的模型中,我有一个 Concert类和一个Venue类(class)。每个 field 都有多场音乐会。我一直在用一个简单的

将 Concert 类链接到 Venue

venue = models.IntegerField(max_length = 10)

...包含场所对象的主键。一位同事建议我们使用 venue = models.ForeignKey(Venue)反而。虽然这也有效,但我想知道是否值得切换,因为我已经能够通过简单地使用 Concert.objects.filter(venue=4) 中的 field ID 解析出 field 的所有音乐会。就像我用 ForeignKey 做的一样: Venue_instance.Concert_set.all() .我在使用我的方法时从未遇到过任何问题。

我的看法是,使用 IntegerFieldobjects.filter()ForeignKey 一样是“ManyToOne”关系,所以我想知道我哪里错了。为什么是ForeignKeys有利?他们更快吗?是不是更好的数据库设计?更简洁的代码?

最佳答案

我想说外键最实际的好处是能够自动查询跨关系。 Django 自动生成 JOIN。

正如您提到的,自动反向关系助手也很棒。

下面是一些只有整数关系会更复杂的例子。

concerts = Concert.objects.filter(...)

concerts.order_by('venue__attribute') # ordering beyond PK.
concerts.filter(venue__name='foo') # filter by a value across the relationship
concerts.values_list('venue__name') # get just venue names
concerts.values('venue__city').annotate() # get unique values across the venue

concerts.filter(venue__more__relationships='foo')

Venue.objects.filter(concert__name='Coachella') # reverse lookups work too

# with an integer field for Concert.venue, you'd have to do something like...
Venue.objects.filter(id__in=Concert.objects.filter(name='Coachella'))

正如其他人所指出的...数据库完整性很有用,级联删除(当然是可定制的)和 facepalm 我刚刚想到 django admin 和表单框架与外键配合得非常好.

class ConcertInline(admin.TabularInline):
model = Concert

class VenueAdmin(admin.ModelAdmin):
inlines = [ConcertInline]
# that was quick!

我相信还有更多 Django 功能处理外键的示例。

关于python - 为什么 models.ForeignKey 有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9156490/

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