Django --外键似乎不起作用

ilmyapht  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(166)

我的Django应用中有以下模型:

class Dataset(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False
    )
    name = models.CharField(max_length=100, blank=False)
    created_date = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)

class Imagefile(models.Model):
    uuid = models.CharField(max_length=36, default="")
    name = models.CharField(max_length=100, default="")
    file = models.FileField(upload_to=image_directory_path)
    dataset = models.ForeignKey(
        Dataset,
        on_delete=models.CASCADE,
        related_name="imagefiles",
        blank=False,
        null=False,
    )

class Annotation(models.Model):
    image = models.FileField(upload_to=image_annotation_directory_path)
    json = models.JSONField(default=dict)
    imagefile = models.ForeignKey(
        Imagefile,
        on_delete=models.CASCADE,
        related_name="annotation",
        blank=False,
        null=False,
    )

我想要实现的是存储一个具有多个ImagefilesDataset,并且每个Imagefile可以具有0或1个相关的Annotation
我可以创建属于它的DatasetImagefiles。但是,当我尝试创建Annotation时,它没有在Imagefile中注册。换句话说,Annotation引用Imagefile,但Imagefile看到的是空的Annotation
下面是我创建测试用例的方法:

dataset = Dataset.objects.get(uuid=..., name='test_dataset')

new_imagefile = Imagefile.objects.create(
                    uuid=...,
                    dataset=dataset,
                    name='test_image.png'
                )
new_imagefile.file.save('/some/existing/path/image.png', open('test_image.png', "rb"))

new_annot = Annotation.objects.create(imagefile=new_imagefile)
new_annot.image.save('/some/other/existing/path/annot.png', open('annot.png', "rb"))

当上面的过程完成后,打印new_imagefile.annotation会得到dataset.Annotation.None,我已经为此奋斗了几个小时,任何提示都是值得的。

fwzugrvs

fwzugrvs1#

哇,我在发布问题后就发现了这个问题--在Annotation的定义中,我应该使用OneToOneField而不是ForeignKey。这解决了我的问题。
我希望这能帮助其他有同样问题的人。

相关问题