相关文章推荐
卖萌的牛肉面  ·  【Java知识点详解 ...·  1 年前    · 
帅气的松球  ·  NCNN、OpenVino、 ...·  1 年前    · 

使用Django从OnetoOne和ForeignKey查询中返回元素

0 人关注

我有以下三个表,我试图写一个查询(或多个查询),从他们各自的表中返回所有 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)

有什么更好的方法吗? 我怎样才能做到呢?

5 个评论
Well, you have a OneToOneField on Address , so you can have only one Event per Address
@BernardoDuarte 这就是为什么我想知道这种逻辑是否可行。我需要一个 event ,但对于每个 Event 的实例来说
那么,你想保持 models.py 的结构还是可以改变?
@BernardoDuarte 请随意修改,但我们的想法是每个 event 只能有一个 address ,这样用户就不能在同一事件发生时使用多个地址。(可能是做错了) 谢谢
@cu__007 因为地址和事件是一对一的关系,你可以通过 address.event 得到一个地址事件(地址是地址的一个实例),反之则是 event.address 。这里不需要使用 .all() ,因为只有一个相关对象。
python
django
django-queryset
cu__007
cu__007
发布于 2021-02-19
1 个回答
Bernardo Duarte
Bernardo Duarte
发布于 2021-02-19
已采纳
0 人赞同

Well, you have a OneToOneField on Address , so you can have only one Event per Address .

现在,你能做的是。

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使用同一地址,每个Event有多个Activity

现在要按地址发布所有事件,你可以这样做。