django:更改父母,当孩子被删除时(单向OneToone)

发布于 2025-02-03 03:49:36 字数 1302 浏览 1 评论 0原文

当我删除标记为photphoto对象时,我想更改照片“标记”字段false。

#models.py
class Photo(models.Model):
    image = models.ImageField(upload_to='shoes_data/%Y/%m/%d', name='image')
    created = models.DateTimeField(auto_now_add=True)
    labeled = models.BooleanField(default=False)

class LabeledPhoto(models.Model):
    labeled_image = models.OneToOneField(Photo, on_delete=models.PROTECT, related_name='labeled_image')
    topcategory = models.CharField(max_length=64)
    subcategory = models.CharField(max_length=64)
    labeler = models.CharField(max_length=32)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

我尝试过这样的

# views.py
class LabeledPhotoDelete(DeleteView):
    model = LabeledPhoto
    template_name = 'label/labeled_photo_delete.html'
    success_url = reverse_lazy('photo:labeled_list')

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        success_url = self.get_success_url()
        labeled = LabeledPhoto.objects.get(id=self.object.pk)
        labeled.labeled_image.labeled = False
        labeled.save()
        self.object.delete()
        return reverse(success_url)

I want to change Photo 'labeled' field False when I delete LabeledPhoto object.

#models.py
class Photo(models.Model):
    image = models.ImageField(upload_to='shoes_data/%Y/%m/%d', name='image')
    created = models.DateTimeField(auto_now_add=True)
    labeled = models.BooleanField(default=False)

class LabeledPhoto(models.Model):
    labeled_image = models.OneToOneField(Photo, on_delete=models.PROTECT, related_name='labeled_image')
    topcategory = models.CharField(max_length=64)
    subcategory = models.CharField(max_length=64)
    labeler = models.CharField(max_length=32)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

I tried like this but, It didn't work

# views.py
class LabeledPhotoDelete(DeleteView):
    model = LabeledPhoto
    template_name = 'label/labeled_photo_delete.html'
    success_url = reverse_lazy('photo:labeled_list')

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        success_url = self.get_success_url()
        labeled = LabeledPhoto.objects.get(id=self.object.pk)
        labeled.labeled_image.labeled = False
        labeled.save()
        self.object.delete()
        return reverse(success_url)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

土豪我们做朋友吧 2025-02-10 03:49:36

您需要.save() photo

from django.http import HttpResponseRedirect

class LabeledPhotoDelete(DeleteView):
    model = LabeledPhoto
    template_name = 'label/labeled_photo_delete.html'
    success_url = reverse_lazy('photo:labeled_list')

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        success_url = self.get_success_url()
        image = self.object.labeled_image
        image.labeled = False
        image.save()
        self.object.delete()
        return HttpResponseRedirect(success_url)

但是没有理由存储是否在字段中标记图像:知道这一点。实际上,您可以添加一个属性:

class Photo(models.Model):
    image = models.ImageField(upload_to='shoes_data/%Y/%m/%d', name='image')
    created = models.DateTimeField(auto_now_add=True)

    @property
    def labeled(self):
        try:
            return self.labeled_image is not None
        except LabeledPhoto.DoesNotExist:
            return False

如果存在labeledphoto的事实,则将QuerySet注释:

from django.db.models import BooleanField, ExpressionWrapper, Q

Photo.objects.annotate(
    is_labeled=ExpressionWrapper(
        Q(labeled_image__isnull=False),
        output_field=BooleanField()
    )
)

You need to .save() the Photo:

from django.http import HttpResponseRedirect

class LabeledPhotoDelete(DeleteView):
    model = LabeledPhoto
    template_name = 'label/labeled_photo_delete.html'
    success_url = reverse_lazy('photo:labeled_list')

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        success_url = self.get_success_url()
        image = self.object.labeled_image
        image.labeled = False
        image.save()
        self.object.delete()
        return HttpResponseRedirect(success_url)

But there is no reason to store whether the image is labeled in a field: you can simply look that up if you want to know this. Indeed, you can add a property:

class Photo(models.Model):
    image = models.ImageField(upload_to='shoes_data/%Y/%m/%d', name='image')
    created = models.DateTimeField(auto_now_add=True)

    @property
    def labeled(self):
        try:
            return self.labeled_image is not None
        except LabeledPhoto.DoesNotExist:
            return False

or annotate the queryset with the fact if a LabeledPhoto exists:

from django.db.models import BooleanField, ExpressionWrapper, Q

Photo.objects.annotate(
    is_labeled=ExpressionWrapper(
        Q(labeled_image__isnull=False),
        output_field=BooleanField()
    )
)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文