1

我正在阅读以下教程,models.py 代码似乎被破坏了(我在 Mac 和 Django 1.4.1 上)。

这是models.py代码:

from django.db import models

from django.contrib.auth.models import User
from django.contrib import admin

class Album(models.Model):
    title = models.CharField(max_length=60)
    public = models.BooleanField(default=False)
    def __unicode__(self):
        return self.title

class Tag(models.Model):
    tag = models.CharField(max_length=50)
    def __unicode__(self):
        return self.tag

class Image(models.Model):
    title = models.CharField(max_length=60, blank=True, null=True)
    image = models.FileField(upload_to='images/')
    tags = models.ManyToManyField(Tag, blank=True)
    albums = models.ManyToManyField(Tag, blank = True)
    created = models.DateTimeField(auto_now_add=True)
    rating = models.IntegerField(default=50)
    width = models.IntegerField(blank=True, null=True)
    height = models.IntegerField(blank=True, null=True)
    user = models.ForeignKey(User, null=True, blank=True)
    def __unicode__(self):
        return self.image.name

    def save(self, *args, **kwargs):
        """Save image dimensions."""
        super(Image, self).save(*args, **kwargs)
        im = PImage.open(os.path.join(MEDIA_ROOT, self.image.name))
        self.width, self.height = im.size
        super(Image, self).save(*args, ** kwargs)

    def size(self):
        """Image size."""
        return "%s x %s" % (self.width, self.height)

    def __unicode__(self):
        return self.image.name

    def tags_(self):
        lst = [x[1] for x in self.tags.values_list()]
        return str(join(lst, ', '))

    def albums_(self):
        lst = [x[1] for x in self.albums.values_list()]
        return str(join(lst, ', '))

    def thumbnail(self):
        return """<a href="/media/%s"><img border="0" alt="" src="/media/%s" height="40" /></a>""" % (
                                                                    (self.image.name, self.image.name))
    thumbnail.allow_tags = True

class AlbumAdmin(admin.ModelAdmin):
    search_fields = ['title']
    list_display = ['title']

class TagAdmin(admin.ModelAdmin):
    list_display = ['tag']

class ImageAdmin(admin.ModelAdmin):
    search_fields = ['title']
    list_display = ["__unicode__", "title", "user", "rating", "size", "tags_", "albums_",
        "thumbnail", "created"]
    list_filter = ["tags", "albums", "user"]

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        obj.save()

admin.site.register(Album, AlbumAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Image, ImageAdmin)

这是我尝试同步数据库时遇到的错误:

Error: One or more models did not validate:
photoapp.image: Accessor for m2m field 'tags' clashes with related m2m field 'Tag.image_set'. Add a related_name argument to the definition for 'tags'.
photoapp.image: Accessor for m2m field 'albums' clashes with related m2m field 'Tag.image_set'. Add a related_name argument to the definition for 'albums'.

非常感谢任何帮助。

4

2 回答 2

2

你有重复M2M的,Tag因为albums你想改变它Album。拥有相关名称也是个好主意

tags = models.ManyToManyField(Tag, blank=True)
albums = models.ManyToManyField(Tag, blank = True,)

改成

tags = models.ManyToManyField(Tag, blank=True, related_name="img_tags")
albums = models.ManyToManyField(Album, blank = True, related_name="img_albums")
于 2012-09-14T19:31:15.497 回答
0

当您有两个字段是同一模型的外键时,您需要提供一个related_name让 django 知道如何调用该关系的字段。这就是错误所说的。

所以,通过给你的关系一个唯一的名字来更新你的模型:

tags = models.ManyToManyField(Tag, blank=True, related_name='image_tags')
albums = models.ManyToManyField(Tag, blank = True, related_name='album_tags')

但是,您的意思可能是这样的:

tags = models.ManyToManyField(Tag, blank=True)
albums = models.ManyToManyField(Album, blank=True)
于 2012-09-14T19:32:12.703 回答