如何在Djang中引用具有通用ForeignKey引用的对象

2024-04-26 05:02:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,它有三个模型,使用ContentTypes和Generic来尝试并允许任务模型使用How to use dynamic foreignkey in Django?作为向导,将ForeignKey指向其他两个模型中的任何一个(尽管我承认,我不知道这种方法会发生什么)。在

class Task(models.Model):
    date = models.DateTimeField(null = True)
    day = models.IntegerField(null = True)
    task = models.CharField(max_length = 100, null = False)
    owner = models.CharField(max_length = 25, null = True)
    notes = models.CharField(max_length = 250, null = True)
    isDone = models.BooleanField(default = False, null = False)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    maintenance = generic.GenericForeignKey('content_type', 'object_id')

class Maintenance(models.Model):
    startMonth = models.CharField(max_length = 15, null = False)
    startYear = models.IntegerField(null = False)
    location = models.CharField(max_length = 20, null = False)
    mode = models.CharField(max_length = 20, null = False)

    taskRef = generic.GenericRelation(Task)

class Template(models.Model):
    name = models.CharField(max_length = 25, null = False)
    location = models.CharField(max_length = 20, null = False)
    mode = models.CharField(max_length = 20, null = False)

    taskRef = generic.GenericRelation(Task)

通常情况下,如果Task只是有一个普通的ForeignKey来维护,我可以使用维护任务集.all(),但是对于这个动态的foreignkey系统,该函数不起作用。有没有人知道有其他的函数调用来实现这种效果?在


Tags: django模型falsetruetaskmodelmodelsnull
1条回答
网友
1楼 · 发布于 2024-04-26 05:02:29

就像user710907 says,维护任务参考所有()应该能做到。指定ForeignKey关系时,可以设置用于反向关系的“related_name”参数。如果不指定,则默认为“model_name_set”。在

class Foo(models.Model):
    ...

class Bar(models.Model):
    ...
    foo = models.ForeignKey(Foo, related_name="related_bars")

现在您可以通过bar.foo从一侧访问该关系,或者从另一侧通过foo.related_bars访问该关系。如果不指定,后一个参数将默认为foo.bar_set。在

在您的示例中,您从两边定义关系;FK在Task中定义,引用在Maintenance和Template上定义。由于您在两个模型上都提供了处理关系的字段,因此不需要提供维护设置默认值。在

编辑:经过进一步的检查,我认为部分的混乱可能是关于您的Task.maintenance字段。如果我没弄错的话,那就是你想要指向MaintenanceTemplate的字段,对吗?那么它为什么叫maintenance?我当然建议你也读this section of the docs。在

相关问题 更多 >