首页 > 解决方案 > 使用 OneToOneField 扩展模型

问题描述

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

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()

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

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

标签: django

解决方案


我建议使用继承而不是 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])

推荐阅读