相关疑难解决方法(0)

从Django中的基本模型实例返回代理模型实例的正确方法?

说我有模特:

class Animal(models.Model):
    type = models.CharField(max_length=255)

class Dog(Animal):
    def make_sound(self):
        print "Woof!"
    class Meta:
        proxy = True

class Cat(Animal):
    def make_sound(self):
        print "Meow!"
    class Meta:
        proxy = True
Run Code Online (Sandbox Code Playgroud)

让我们说我想做:

 animals = Animal.objects.all()
 for animal in animals:
     animal.make_sound()
Run Code Online (Sandbox Code Playgroud)

我想找回一系列的Woofs和Meows.很明显,我可以在原始模型中定义一个基于animal_type分叉的make_sound,但每次我添加一个新的动物类型(想象它们在不同的应用程序中)时,我必须进入并编辑make_sound函数.我宁愿只定义代理模型并让它们自己定义行为.据我所知,没有办法返回混合的Cat或Dog实例,但我想也许我可以在主类上定义一个返回cat或dog模型的"get_proxy_model"方法.

当然你可以这样做,并传递类似主键的东西,然后只做Cat.objects.get(pk = passed_in_primary_key).但这意味着对您已经拥有的数据进行额外查询,这似乎是多余的.有没有办法以有效的方式将动物变成猫或狗的实例?做我想做的事的正确方法是什么?

python django proxy-classes django-models

26
推荐指数
3
解决办法
6382
查看次数

将代理模型实例分配给外键

我有一个django auth用户代理模型,它附加了一些额外的权限,如下所示:

class User(User):
    class Meta:
        proxy = True
        permissions = (
            ("write_messages","May add new messages to front page"),
            ("view_maps","Can view the maps section"),
        )
Run Code Online (Sandbox Code Playgroud)

在模型的其他地方,我有一个将User作为外键的对象:

class Project(models.Model):
    creation_date   = models.DateTimeField(auto_now_add=True)
    modify_date     = models.DateTimeField(auto_now=True)
    owner           = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

在我的一个视图中,我尝试使用当前用户作为所有者创建一个新项目

@login_required
def new_project(request):
    project = Project.objects.create(owner=request.user)
Run Code Online (Sandbox Code Playgroud)

但是,这会返回错误:

Cannot assign "<User: mwetter>": "Project.owner" must be a "User" instance.
Run Code Online (Sandbox Code Playgroud)

我假设项目对象中的外键所有者是指Django User的基类而不是我的代理类.有没有办法将我的代理用户称为外键?

python django

2
推荐指数
1
解决办法
2042
查看次数

标签 统计

django ×2

python ×2

django-models ×1

proxy-classes ×1