使用OneToOneField扩展模型

时间:2019-11-22 03:30:14

标签: django

我正在尝试扩展django-taggit Tag模型,使其上具有added_by(用户的外键)字段,因此我可以查询特定用户添加的所有标签。因此,我创建了一个应用程序,并在models.py中创建了另一个名为MyTag的模型,并在其上有一个Tag要使用的OneToOneField:

from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from taggit.models import Tag


class MyTag(models.Model):
    tag = models.OneToOneField(Tag, on_delete=models.CASCADE)
    added_by = models.ForeignKey(User, on_delete=models.CASCADE)

@receiver(post_save, sender=Tag)
def create_tag(sender, instance, created, **kwargs):
    if created:
        MyTag.objects.create(tag=instance, added_by=???)

@receiver(post_save, sender=Tag)
def save_tag(sender, instance, **kwargs):
    instance.mytag.save()

问题是,我无法从models.py内部访问request.user

如何克服该问题,即如何正确扩展django-taggit的Tag模型以在其上添加了add_by字段?

1 个答案:

答案 0 :(得分:0)

我建议使用继承而不是OneToOneField。

from taggit.models import Tag

class MyTag(Tag):
    added_by = models.ForeignKey(User, on_delete=models.CASCADE)

现在, MyTag 模型继承了 Tag 模型的所有属性和方法。此处更多信息:https://docs.djangoproject.com/en/2.2/topics/db/models/#model-inheritance

现在可以在视图中创建MyTag的新实例:

MyTag.objects.create(added_by=request.user , [... other Tag properties])