0

这是我的models.py:

class Image(models.Model):
    user = models.ForeignKey(User)
    caption = models.CharField(max_length=300)
    image = models.ImageField(upload_to=get_upload_file_name)
    pub_date = models.DateTimeField(default=datetime.now)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Images')

    def __unicode__(self):
        return "%s - %s" % (self.caption, self.user.username)


class ProfilePic(Image):
    pass



class BackgroundPic(Image):
    pass


class Album(models.Model):
    name = models.CharField(max_length=150)

    def __unicode__(self):
        return self.name


class Photo(Image):
    album = models.ForeignKey(Album, default=3)

这是另一个:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    permanent_address = models.TextField()
    temporary_address = models.TextField()
    profile_pic = models.ForeignKey(ProfilePic)
    background_pic = models.ForeignKey(BackgroundPic)

    def __unicode__(self):
        return self.user.username

我可以使用其 User 对象访问 Parent 类。

>>>m = User.objects.get(username='mika')
>>>m.image_set.all()
>>>[<Image: mika_photo - mika>, <Image: mika_pro - mika>, <Image: mika_bf - mika>]

但我无法通过用户访问它的子类。我试过了:

>>>m.Image.profilepic_set.all()

>>>m.image_set.profilpic.all()

和这个

编辑

>>>m.profilepic_set.all() 
AttributeError:'User' object has no attribute 'profilepic_set'

但都给了我错误!

编辑

如何访问子类,以便将图像从一个类添加到另一个类。

例如:将图片从 Photo 复制到 ProfilePic,或从 ProfilePic 复制到 BackgroundPic 等等。或者简单地说,如何为特定类中的特定用户添加图像?

编辑

我想要的是,每个用户都将拥有profile picturesbackground imagesphotos uploaded. 这些图像将单独保存在模板中。如果用户需要,他可以轻松地使用(复制)上传的另一组照片或背景图像集中的图像,作为个人资料图片,并将该图像添加到profile picture set. 或者,如果他愿意,他可以使用来自其他类的图像profile picture set或来自其他类uploaded photosbackground image图像,类似地,从其他类使用的图像将被复制到background image set.

请指导我实现上述目标。将不胜感激。谢谢你。

4

2 回答 2

1

一种简单的方法是直接过滤继承的模型:

ProfilePic.objects.filter(user=m)

_set如果您使用的相关语法是否适用于任何形式的继承模型,我无法回忆。

您还为模型定义了外键profile_pic-如果您尝试访问这些图像,它们对于外键正常工作:background_picUserProfile

m.profile_pic

我不知道为什么你有外键和一个什么都不做的专门子类。

于 2013-11-04T21:30:10.603 回答
0

首先,注意自 Django 1.5 以来已更改的 User 模型:您现在可以提供 User 模型而无需链接到 Django“user”类。

然后,您可以做两件事:

(正如彼得解释的那样)

ProfilePic.objects.filter(user=m)

当您不想将图片链接到用户时(而是将用户链接到图片)

class User (models.Model):
    pic = models.ForeignKey(Pic)

class Pic (models.Model):
    picture = models.ImageField(upload_to=get_upload_file_name)

u = User.objects.get(pk=42)
u.pic # --> gives you the one picture that a user can have

p = Pic.objects.get(pk=42)
p.user_set # --> gives you 0 to (many) users that have this pic linked to it.

如果每个用户可以有很多张图片并且每张图片可以有很多用户,那么您想要的是“many_to_many_field”。

如果您想要用户的头像,请使用“用户”对象中的图片。如果您想为用户提供多张图片(如在“相册”中),请使用 ForeignKey 到图片模型。如果您想将多张图片链接到多个用户(如“标记为收藏”),请使用多对多。

然后,为了将一个文件复制到另一个文件,使用这种东西:

from PIL import Image
class MyImages(models.Model):
      photo_one = models.ImageField(upload_to="one/", blank=True, null=True)
      photo_two = models.ImageField(upload_to="two/", blank=True, null=True)
      def copy(self):
           self.photo_two.save(self.photo_one.name, ContentFile(file(self.photo_one.path).read()))
于 2013-11-04T22:31:44.723 回答