django model on_delete将自己传递给models.SET() [英] django model on_delete pass self to models.SET()

查看:1223
本文介绍了django model on_delete将自己传递给models.SET()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,我有一本书模型,每本书都有它的作者和标签。

  def get_authors_first_tag(book):
try:
tag = book.author.tags.first )
除了:
返回无
其他:
返回标签


类作者(models.Model):
name = models.CharField(max_length = 50)
tags = models.ManyToManyField('Tag')

class Book(models.Model):
name = models.CharField (max_length = 50)
author = models.ForeignKey(作者)
tag = models.ForeignKey('Tag',null = True,on_delete = models.SET(get_authors_first_tag))

我想要删除标签项时,书的标签将被设置为其作者的第一个标签。怎么办?谢谢。
文档页面 - https:/ /docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.SET



更新。
信号没有帮助

 从django.db.models.signals导入post_delete 
从django。调度导入接收器

类书(models.Model):
#临时设置为NULL,删除,
#becouse为我的neds我不能使用默认行为(models.CASCADE)
tag = models.ForeignKey('Tag',null = True,on_delete = models.SET_NULL)

@receiver(post_delete,sender = Tag)
def delete_tag(instance, ** kwargs):
为book.set_all():
尝试:
book.tag = book.author.tags.first()
book.save ()
除了:
通过

UPDATE2
最终工作解决方案是:
(脏,但工作)

  @receiver(post_delete,sender = Tag)
def delete_tag(实例,** kwargs):
books = Book.objects.all()
书中的书籍:
#标签项删除后,book.tag设置为无
#所以如果boook的标签是null,得到它的作者的第一个标签
如果不是book.tag:
book.tag = book.author.tags.first()
book.save()


解决方案

SET() code>不接受任何参数,因此您应该使用信号 receiver:

  from django.db.models.signals.pre_delete 
from django.dispatch import receiver

@receiver(pre_delete,sender = Tag)
def reset_tag(sender,** kwargs):
tag = kwargs ['instance']
用于书中的书。 filter(tag = tag):
book.tag = book.author.tags.first()
book.save()

将此代码放入您的 models.py 中,或确保将接收器放入的文件在启动时导入,因此接收器实际上已连接。


For example, I have a Book model, each book has its author and tag.

def get_authors_first_tag(book):
    try:
        tag = book.author.tags.first()
    except:
        return None
    else:
        return tag.id


class Author(models.Model):
    name = models.CharField(max_length=50)
    tags = models.ManyToManyField('Tag')

class Book(models.Model):
  name = models.CharField(max_length=50)
  author = models.ForeignKey(Author)
  tag =  models.ForeignKey('Tag', null=True, on_delete=models.SET(get_authors_first_tag))

I want, when deleting a Tag item, book's tag will be set to its author's first tag. How to do this? Thanks. Doc page - https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.SET

UPDATE. signals didn't help

from django.db.models.signals import post_delete
from django.dispatch import receiver

class Book(models.Model):
  # temporaryly set to NULL on delete, 
  # becouse for my neds I cannot use default behavior (models.CASCADE)
  tag =  models.ForeignKey('Tag', null=True, on_delete=models.SET_NULL)

@receiver(post_delete, sender=Tag)
def delete_tag(instance, **kwargs):
    for book in instance.book_set.all():
        try:
            book.tag = book.author.tags.first()
            book.save()
        except:
            pass

UPDATE2 final working solution is: (dirty, but works)

@receiver(post_delete, sender=Tag)
def delete_tag(instance, **kwargs):
    books = Book.objects.all()
    for book in books:
        # after Tag item deleting, book.tag is set to None
        # so if boook's tag is null, get it's author's first tag
        if not book.tag:
            book.tag = book.author.tags.first()
            book.save()

解决方案

The SET() doesn't accept any arguments, so you should use the signal receiver:

from django.db.models.signals.pre_delete
from django.dispatch import receiver

@receiver(pre_delete, sender=Tag)
def reset_tag(sender, **kwargs):
    tag = kwargs['instance']
    for book in books.filter(tag=tag):
        book.tag = book.author.tags.first()
        book.save()

Put this code into your models.py or make sure the file you put the receiver into is imported at the startup, so that the receiver is actually connected.

这篇关于django model on_delete将自己传递给models.SET()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆