return 个来自 OnetoOne 的元素和使用 Django 的 ForeignKey 查询

return elements from OnetoOne and ForeignKey Query using Django

我有下面的三个表,我正在尝试编写一个查询(或多个查询)来 return 来自各自表的所有 addressevents 字段。

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)