说我有模特:
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).但这意味着对您已经拥有的数据进行额外查询,这似乎是多余的.有没有办法以有效的方式将动物变成猫或狗的实例?做我想做的事的正确方法是什么?
我有一个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的基类而不是我的代理类.有没有办法将我的代理用户称为外键?