Django关系到另一张表中的两列



我想使用外键与ToDoLists建立关系,并在我的ToDoItems中具有ToDoListes的日期。更具体地解释:我希望从我的ToDoLists表到te ToDoItems表实现一对多,所以我需要外键作为ToDoList的id,但我需要ToDoItemss表上的ToDoList中的日期我有:

class ToDoLists(models.Model):
todo_id = models.AutoField(primary_key=True)
date = models.DateField(null=False)
class ToDoItems(models.Model):
item_id = models.AutoField(primary_key=True)
to_do_list = models.ForeignKey(ToDoLists,related_name='to_do_items', on_delete=models.CASCADE)
date = models.ForeignKey(ToDoLists, to_field='date', on_delete=models.CASCADE)

我想使用外键与ToDoLists建立关系,并在我的ToDoItems中有来自ToDoList的日期,但我收到了这个错误:

ERRORS:
api.ToDoItems.date: (fields.E311) 'ToDoLists.date' must set unique=True because it is referenced by a foreign key.

作为一个日期,我不希望它是唯一的,因为我可以有多个具有相同日期的待办事项列表

您应该只引用ToDoLists模型,因此:

class ToDoLists(models.Model):
todo_id = models.AutoField(primary_key=True)
date = models.DateField(null=False)
class ToDoItems(models.Model):
item_id = models.AutoField(primary_key=True)
to_do_list= models.ForeignKey(
ToDoLists,
related_name='to_do_items',
on_delete=models.CASCADE
)

ForeignKey是相关对象的惰性加载getter。因此,您可以使用获得ToDoItems对象的相关to_do_list对象的date

mytodos_item.to_do_list.date

如果您经常需要,您可以创建一个自动获取它的属性,或者您可以注释查询集以获得ToDoItems模型对象中的数据:

class ToDoItems(models.Model):
item_id = models.AutoField(primary_key=True)
to_do_list = models.ForeignKey(
ToDoLists,
related_name='to_do_items',
on_delete=models.CASCADE
)
@property
def date(self):
return self.to_do_list.date

或者在管理器[Django-doc]中使用注释Django-dok]:

from django.db.models importF
class ToDoItemsManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).annotate(
date=F('to_do_list__date')
)
class ToDoItems(models.Model):
item_id = models.AutoField(primary_key=True)
to_do_list = models.ForeignKey(
ToDoLists,
related_name='to_do_items',
on_delete=models.CASCADE
)
objects = ToDoItemsManager()

最好而不是存储引用项的Date,因为如果以后更新ToDoLists对象的date,将很难保持列同步。

注意:通常Django模型被赋予单数名称,因此TodoItem而不是ToDoItems

相关内容

最新更新