return 个来自 OnetoOne 的元素和使用 Django 的 ForeignKey 查询
return elements from OnetoOne and ForeignKey Query using Django
我有下面的三个表,我正在尝试编写一个查询(或多个查询)来 return 来自各自表的所有 address
和 events
字段。
class Activity(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(max_length=500)
class Event(models.Model):
date = models.DateField()
start_time = models.TimeField()
duration = models.PositiveSmallIntegerField()
activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name="activities")
class Address(models.Model):
event = models.OneToOneField(Event, on_delete=models.CASCADE, primary_key=True)
address = models.CharField(max_length=100)
这是我试过的,但似乎不合适,崩溃了!
adds = Address.objects.all()
for ad in adds:
for events in ad.event.all():
print("events", events)
有更好的方法吗?我怎样才能实现它?
谢谢
嗯,你在 Address
上有一个 OneToOneField
,所以每个 Address
只能有一个 Event
。
现在,您可以做的是:
adds = Address.objects.all()
for ad in adds:
event = ad.event # you only have one event per address
我建议您将 models.py
更改为:
class Address(models.Model):
address = models.CharField(max_length=100)
class Event(models.Model):
date = models.DateField()
start_time = models.TimeField()
duration = models.PositiveSmallIntegerField()
address = models.ForeignKey(Address, on_delete=models.CASCADE, related_name='events')
class Activity(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(max_length=500)
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='activities')
这样你每个 Event
只有一个 Address
,但是你可以使用相同的地址给多个 Event
,并且你有多个 Activity
Event
.
现在您可以通过地址发布所有事件:
addresses = Address.objects.all()
for addr in addresses:
for event in addr.events.all():
print('event', event)
我有下面的三个表,我正在尝试编写一个查询(或多个查询)来 return 来自各自表的所有 address
和 events
字段。
class Activity(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(max_length=500)
class Event(models.Model):
date = models.DateField()
start_time = models.TimeField()
duration = models.PositiveSmallIntegerField()
activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name="activities")
class Address(models.Model):
event = models.OneToOneField(Event, on_delete=models.CASCADE, primary_key=True)
address = models.CharField(max_length=100)
这是我试过的,但似乎不合适,崩溃了!
adds = Address.objects.all()
for ad in adds:
for events in ad.event.all():
print("events", events)
有更好的方法吗?我怎样才能实现它?
谢谢
嗯,你在 Address
上有一个 OneToOneField
,所以每个 Address
只能有一个 Event
。
现在,您可以做的是:
adds = Address.objects.all()
for ad in adds:
event = ad.event # you only have one event per address
我建议您将 models.py
更改为:
class Address(models.Model):
address = models.CharField(max_length=100)
class Event(models.Model):
date = models.DateField()
start_time = models.TimeField()
duration = models.PositiveSmallIntegerField()
address = models.ForeignKey(Address, on_delete=models.CASCADE, related_name='events')
class Activity(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(max_length=500)
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='activities')
这样你每个 Event
只有一个 Address
,但是你可以使用相同的地址给多个 Event
,并且你有多个 Activity
Event
.
现在您可以通过地址发布所有事件:
addresses = Address.objects.all()
for addr in addresses:
for event in addr.events.all():
print('event', event)