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

あなたは私がそれを変更したいので、と重複M2MTagています。また、関連する名前も付けておくことをお勧めしますalbumsAlbum

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

同じモデルへの外部キーである 2 つのフィールドがある場合、related_namedjango がリレーションを何と呼ぶか​​を知るために を提供する必要があります。それがエラーが言っていることです。

したがって、リレーションに一意の名前を付けてモデルを更新します。

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 に答える