2016-04-04 44 views
4

私はdjangoフレームワークで遊んでいましたが、makemigrationコマンドで問題が発生しました。モデルのコピーとそれが生成するスタックトレースがあります。 私は同じエラーでいくつかの投稿を見ましたが、私はここで私の問題を解決するために私を導いてくれませんでした。私はあなたがthroughを設定しているもので、そのファイル内ImagePersonというクラスがあるように思えませんジャンゴ1.9.4Django makemigrations AttributeError: 'str'オブジェクトに '_meta'属性がありません

from django.db import models 
import os, uuid 

# Create your models here. 
def video_directory_path(instance, folder): 
    return os.path.join('video', str(instance.person.id), str(instance.video_id)) 

def photo_directory_path(instance, folder): 
     return os.path.join('image', str(instance.person.id), str(instance.photo_id)) 


class Image(models.Model): 
    name = models.CharField(max_length=128) 
    photo_id = models.UUIDField(verbose_name='photo id', default=uuid.uuid4, editable=False, unique=True) 
    photo = models.ImageField(upload_to=photo_directory_path) 
    person = models.ForeignKey('Person', on_delete=models.CASCADE) 
    movie = models.ForeignKey('Movie', on_delete=models.CASCADE) 

    class Meta: 
     db_table = 'Image' 

    def __str__(self): 
     return '[{0}- {1}]'.format(self.__class__.__name__, self.id) 

    def __repr__(self): 
     return self.__str__() 


class Video(models.Model): 
    name = models.CharField(max_length=128) 
    video_id = models.UUIDField(verbose_name='video id', default=uuid.uuid4, editable=False, unique=True) 
    video = models.FileField(upload_to=video_directory_path) 
    person = models.ForeignKey('Person', on_delete=models.CASCADE) 
    movie = models.ForeignKey('Movie', on_delete=models.CASCADE) 

    class Meta: 
     db_table = 'Video' 

    def __str__(self): 
     return '[{0}-{1}]'.format(self.__class__.__name__, self.id) 

    def __repr__(self): 
     return self.__str__() 


class Filmography(models.Model): 
    filmography = models.CharField(max_length=128, db_index=True) 

    class Meta: 
     db_table = 'Filmography' 

    def __str__(self): 
     return '[{0}-{1}]'.format(self.__class__.__name__, self.id) 

    def __repr__(self): 
     return self.__str__() 


class Person(models.Model): 
    bio = models.TextField() 
    filmography = models.ManyToManyField('Filmography') 
    photos = models.ManyToManyField(
     'Image', 
     through='ImagePerson', 
     through_fields=('person', 'photo') 
    ) 

    class Meta: 
     abstract = True 

    def __str__(self): 
     return '[{0}-{1}]'.format(self.__class__.__name__, self.id) 

    def __repr__(self): 
     return self.__str__() 


class Profile(Person): 
    first_name = models.CharField(max_length=128, verbose_name="first name") 
    last_name = models.CharField(max_length=128, verbose_name="last name") 
    dob = models.DateField() 

    class Meta: 
     index_together = ["first_name", "last_name"] 
     db_table = 'Profile' 


class Character(Person): 
    name = models.CharField(max_length=128) 

    class Meta: 
     db_table = 'Character' 


class Crew(models.Model): 
    name = models.CharField(max_length=256) 
    members = models.ManyToManyField(
     'Profile', 
     through='MovieCrew', 
     through_fields=('crew', 'profile'), 
    ) 

    class Meta: 
     db_table = 'Crew' 

     def __str__(self): 
      return '{0}: {1}'.format(self.__class__.__name__, self.name) 

    def __repr__(self): 
     return self.__str__() 


class MovieCrew(models.Model): 
    crew = models.ForeignKey(
     'Crew', 
     on_delete=models.CASCADE, 
    ) 
    profile = models.ForeignKey(
     'Profile', 
     on_delete=models.CASCADE, 
    ) 
    role = models.CharField(max_length=256) 

    class Meta: 
     db_table = 'MovieCrew' 


class Genre(models.Model): 
    genre = models.CharField(max_length=128, db_index=True) 

    class Meta: 
     db_table = 'Genre' 


class Movie(models.Model): 
    name = models.CharField(max_length=128, db_index=True) 
    summary = models.CharField(max_length=256) 
    story = models.CharField(max_length=256) 
    release_date = models.DateField() 

    crew = models.OneToOneField(
     'Crew', 
     on_delete=models.CASCADE, 
    ) 
    genre = models.ManyToManyField('Genre') 
    photos = models.ManyToManyField('Image') 
    videos = models.ManyToManyField('Video') 

    class Meta: 
     db_table = 'Movie' 
     get_latest_by = 'release_date' 

    def __str__(self): 
     return '[{0}-{1}]'.format(self.__class__.__name__, self.name) 

    def __repr__(self): 
     return self.__str__() 

とエラースタックトレース

Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 345, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Python34\lib\site-packages\django\core\management\base.py", line 348, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "C:\Python34\lib\site-packages\django\core\management\base.py", line 398, in execute 
    self.check() 
    File "C:\Python34\lib\site-packages\django\core\management\base.py", line 426, in check 
    include_deployment_checks=include_deployment_checks, 
    File "C:\Python34\lib\site-packages\django\core\checks\registry.py", line 75, in run_checks 
    new_errors = check(app_configs=app_configs) 
    File "C:\Python34\lib\site-packages\django\core\checks\model_checks.py", line 28, in check_all_models 
    errors.extend(model.check(**kwargs)) 
    File "C:\Python34\lib\site-packages\django\db\models\base.py", line 1170, in check 
    errors.extend(cls._check_fields(**kwargs)) 
    File "C:\Python34\lib\site-packages\django\db\models\base.py", line 1249, in _check_fields 
    errors.extend(field.check(from_model=cls, **kwargs)) 
    File "C:\Python34\lib\site-packages\django\db\models\fields\related.py", line 1165, in check 
    errors.extend(self._check_relationship_model(**kwargs)) 
    File "C:\Python34\lib\site-packages\django\db\models\fields\related.py", line 1366, in _check_relationship_model 
    for f in through._meta.fields: 
AttributeError: 'str' object has no attribute '_meta' 

答えて

2

で働いています( M2MのPersonにあることを確認してください。

+0

うわー!ありがとう...私はそれを試して見てみましょう。これはdjangoの問題ですか? (それは不明な例外メッセージです) – legend

+1

通常、あなたは他の 'ManyToMany'定義のように' through'宣言を省略します。そのモデルに保存したい追加データがある場合は、通常はカスタムデータを渡します。 Djangoは、ほとんどの場所でモデルや文字列を渡すことができます...私はあなたの質問が何であるかわからない、散歩しています。 – dreamriver

2

あなたの乗組員クラスのインデント問題? ここにあなたのstr方法はメタに定義されているように見える:

class Crew(models.Model): 
    name = models.CharField(max_length=256) 
    members = models.ManyToManyField(
     'Profile', 
     through='MovieCrew', 
     through_fields=('crew', 'profile'), 
    ) 

    class Meta: 
     db_table = 'Crew' 


     def __str__(self): 
      return '{0}: {1}'.format(self.__class__.__name__, self.name) 

    def __repr__(self): 
     return self.__str__() 

は本当にあなたが後に何をしているということですか?

+0

あなたのdownvoteを説明してください。はい、それは疑問の形で提起されましたが、それ以外の方法で私は参照されたコードスニペットを表示することができました。不公平なイホ。 – kjarsenal

+1

私はupvoted ya。どのように圧迫 –

関連する問題