使用OneToOneField扩展模型 [英] Extend a model using OneToOneField

查看:55
本文介绍了使用OneToOneField扩展模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to extend django-taggit Tag model to have an added_by (ForeignKey to User) field on it, so I can query all tags added by a particular user. So, I have created an app and in models.py there I have created another model, called MyTag and I have a OneToOneField to Tag on it:

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 .

The issue is, I can't access request.user from inside models.py.

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

How do I overcome the issue, i.e. how do I properly extend django-taggit's Tag model to have added_by field on it?

推荐答案

我建议使用继承代替OneToOneField.

I would recommend using inheritance instead of 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

Now the MyTag model inherits all the properties and methods of the Tag model. More info here: https://docs.djangoproject.com/en/2.2/topics/db/models/#model-inheritance

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

Now to create a new instance of MyTag you can do in your view:

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

这篇关于使用OneToOneField扩展模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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