我有一个包含三个模型的Django应用,这些模型使用ContentTypes和Generic尝试使用How to use dynamic foreignkey in Django?作为指导,让Task模型具有对其他两个模型中的任一个的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,我可以使用Maintenance.task_set.all()将所有Task连接到任何给定的Maintenance,但是使用此动态外键系统,该功能将无法正常工作。有谁知道实现此影响的替代函数调用?
最佳答案
像user710907 says一样,Maintenance.taskRef.all()应该可以解决问题。指定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上定义的。由于您已经在两个模型上都提供了处理关系的字段,因此无需提供maintenance_set默认值。
编辑:经过进一步检查,我认为部分混乱可能与您的
Task.maintenance
字段有关。如果我没记错的话,那就是您要指向Maintenance
或Template
的字段,对吗?那么为什么叫maintenance
?我当然也建议阅读this section of the docs。