2015-05-27 24 views
7

Tôi đang xây dựng mô hình trong Django 1.8 và tôi đang sử dụng thừa kế trừu tượng (mà tôi giả định đang đóng góp cho vấn đề). Tôi có các mô hình trừu tượng và sau đó tôi có các mô hình dựa trên các mô hình trừu tượng đó. Tôi cũng có quan hệ ForeignKey và ManyToMany giữa một số mô hình.'NoneType' đối tượng không có thuộc tính 'duy nhất' NHƯNG Tôi không sử dụng thuộc tính 'duy nhất'

Mọi thứ đều ổn, nhưng khi tôi cố gắng để syncdb hoặc 'makemigrations blog' tôi nhận được một AttributeError mà nói 'NoneType' đối tượng không có thuộc tính 'duy nhất'.

Tôi không biết tại sao tôi nhận được nó, và tôi đã thử nghiệm với các thiết lập mô hình khác nhau, và tôi đọc rất nhiều bài đăng trên diễn đàn, nhưng bây giờ tôi đã đánh một bức tường.

tôi sẽ đăng traceback và các mô hình của tôi dưới đây:

NGƯỜI MẪU:

indie_db

from django.db import models 

class URL(models.Model): 
    link = models.CharField(max_length=400) 
    name = models.CharField(max_length=200) 

    def __str__(self): 
     return self.name 


class Artist(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.TextField(null=True, blank=True) 
    link = models.ForeignKey(URL) 

    class Meta: 
     abstract = True 
     ordering = ['name'] 

    def __str__(self): 
     return self.name 


class ArtistSingle(Artist): 
    birthdate = models.DateField(null=True, blank=True) 
    deathdate = models.DateField(null=True, blank=True) 


class ArtistGroup(Artist): 
    members = models.ManyToManyField(ArtistSingle) 
    established = models.DateField(null=True, blank=True) 
    disbanded = models.DateField(null=True, blank=True) 


class Contributor(models.Model): 
    contributing_artist = models.ForeignKey(ArtistSingle, null=True, blank=True) 
    alternate_name = models.CharField(max_length=200) 
    role = models.CharField(max_length=200) 


class ProductionCompany(models.Model): 
    name = models.CharField(max_length=200) 
    link = models.ForeignKey(URL) 

    def __str__(self): 
     return self.name 


class Work(models.Model): 
    title = models.CharField(max_length=200) 
    description = models.TextField(null=True, blank=True) 
    created = models.DateField() 
    city = models.CharField(max_length=200) 
    production_company = models.ForeignKey(ProductionCompany, blank=True, null=True) 
    self_published = models.BooleanField(default=False) 
    creator = models.ForeignKey(Artist) 
    link = models.ForeignKey(URL) 
    styles = models.CharField(max_length=200) 
    contributors = models.ManyToManyField(Contributor) 

    class Meta: 
     abstract = True 
     ordering = ['-created'] 

    def __str__(self): 
     return self.title 


class MusicalWork(Work): 
    audio_links = models.ManyToManyField(URL) 


class WrittenWork(Work): 
    excerpt = models.TextField(null=True, blank=True) 


class PerformanceWork(Work): 
    venue = models.CharField(max_length=200) 


class VideoWork(Work): 
    length = models.CharField(max_length=16) 


class VisualWork(Work): 
    images = models.ManyToManyField(URL) 

blog:

from django.db import models 

# Create your models here. 


class Tag(models.Model): 
    tag_name = models.CharField(max_length=200) 

    def __str__(self): 
     return self.tag_name 


class Entry(models.Model): 
    title = models.CharField(max_length=200) 
    body = models.TextField() 
    slug = models.SlugField(max_length=200) 
    publish = models.BooleanField(default=True) 
    created = models.DateTimeField(auto_now=True) 
    modified = models.DateTimeField(auto_now=True) 
    tags = models.ManyToManyField(Tag) 

    def __str__(self): 
     return self.title 

    class Meta: 
     verbose_name = "Blog Entry" 
     verbose_name_plural = "Blog Entries" 
     ordering = ["-created"] 

traceback:

[[email protected] weird_canada]$ python3.4 manage.py makemigrations blog 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/management/__init__.py", line 338, in execute_from_command_line 
    utility.execute() 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/management/__init__.py", line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/management/base.py", line 390, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/management/base.py", line 440, in execute 
    self.check() 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/management/base.py", line 478, in check 
    include_deployment_checks=include_deployment_checks, 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/checks/registry.py", line 72, in run_checks 
    new_errors = check(app_configs=app_configs) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/checks/model_checks.py", line 28, in check_all_models 
    errors.extend(model.check(**kwargs)) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/db/models/base.py", line 1181, in check 
    errors.extend(cls._check_fields(**kwargs)) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/db/models/base.py", line 1258, in _check_fields 
    errors.extend(field.check(**kwargs)) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/db/models/fields/related.py", line 1829, in check 
    errors = super(ForeignKey, self).check(**kwargs) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/db/models/fields/related.py", line 1502, in check 
    errors.extend(self._check_unique_target()) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/db/models/fields/related.py", line 1522, in _check_unique_target 
    for rel_field in self.foreign_related_fields) 
    File "/home/pattmayne/webapps/limbs_008/lib/python3.4/Django-1.8.2-py3.4.egg/django/db/models/fields/related.py", line 1522, in <genexpr> 
    for rel_field in self.foreign_related_fields) 
AttributeError: 'NoneType' object has no attribute 'unique' 

NẾU điều này là do các mô hình kế thừa của tôi, nguyên nhân chính xác là gì và tôi nên thay đổi mọi thứ như thế nào?

Xin cảm ơn trước.

+1

Tôi đang phải đối mặt với vấn đề chính xác như vậy. Bạn đã tìm thấy một giải pháp? Bạn có thể cho chúng tôi biết về nó không? – cpury

Trả lời

3

Tôi tin rằng vấn đề thực sự là với các mô hình Work.

Bạn có một ForeignKey để URL trong lớp trừu tượng,

link = models.ForeignKey(URL) 

Và bạn cũng có chìa khóa để URL trong một số các lớp học có nguồn gốc, ví dụ MusicalWork:

class MusicalWork(Work): 
    audio_links = models.ManyToManyField(URL) 

Vì vậy MusicalWork có hai liên kết đến URL. Mà sẽ là tốt, ngoại trừ Django cố gắng để tạo ra một mối quan hệ ngược lại cho URL để mô hình của bạn, thường được gọi là musicalwork_set cho trường hợp này, nhưng nó có hai mối quan hệ ngược lại cho cùng một mô hình!

Câu trả lời sẽ là chỉ định trường related_name cho bất kỳ mô hình nào lấy được từ trường có cùng tham chiếu mô hình.

Do đó:

class MusicalWork(Work): 
    audio_links = models.ManyToManyField(URL, related_name='musicalwork_audio_set') 

Nhưng có thể có những vấn đề khác như thông báo lỗi không chính xác trỏ đến tình trạng này (tôi tin tưởng, Django có một thông báo lỗi rất đẹp vì sai lầm đặc biệt này).

+0

Tại sao mọi người downvoting? Vấn đề chắc chắn nhất là không chỉ định 'related_name' trong khi có nhiều mối quan hệ trái ngược nhau ... –

1

Điều này là do bạn có khóa Ngoại ngữ cho Mô hình Tóm tắt.

creator = models.ForeignKey(Artist) 

Bạn có thể thay đổi điều này để ArtistSingle

creator = models.ForeignKey(ArtistSingle) 

Lý tưởng nhất là nó nên đã ném một lỗi đúng như

Dòng định nghĩa một mối quan hệ với mô hình 'Artist', mà chưa được cài đặt , hoặc là trừu tượng.

Nhưng vụ tai nạn là một bug with Django 1.8

Các vấn đề liên quan