2016-12-04 43 views
1

我想使它能够在创建模型和实例时为场模型/类选择一个外键。因此,像这样:Python Django - 模型字段的ForeignKey类选项

class Posts(models.Model): 

    OwnerType = (
     (Accounts, 'User'), 
     (Groups, 'Group'), 
    ) 

    PostTypes = (
     ('Text', 'Text'), 
     ('Photo', 'Photo'), 
     ('Audio', 'Audio'), 
     ('Video', 'Video'), 
     ('Link', 'Link'), 
    ) 

    owner = models.ForeignKey(OwnerType, default = 0, related_name = "post_owner") 
    ownerid = models.IntegerField(blank = False, default = 0) 
    owner_type = models.CharField(blank = False, default = '', max_length = 50) 

    title = models.CharField(max_length = 500, default = '') 
    contents = models.CharField(max_length = 500, default = '') 
    attachment = models.CharField(max_length = 500, default = '') 
    attachment_type = models.CharField(max_length = 500, default = '') 
    link = models.CharField(max_length = 500, default = '') 

    post_type = models.CharField(max_length = 20, choices = PostTypes, default = '') 
    status = models.CharField(max_length = 20, default = 'public') # either public, private, or deleted 

    date_created = models.DateField(auto_now_add=True) 
    last_active = models.DateField(auto_now=True) 

    @property 
    def serialize(self): 
     return { 
      'p_id': self.id, 

      'ownerid': self.ownerid, 
      'owner': self.owner.serialize, 
      'owner_type': self.owner_type, 
      'title': self.title, 
      'contents': self.contents, 
      'attachment': self.attachment, 
      'attachment_type': self.attachment_type, 
      'link': self.link, 
      'post_type': self.post_type, 
      'status': self.status, 
      'date_created': self.date_created, 
      'last_active': self.last_active 
     } 

    class Meta: 
     db_table = "posts" 

# --- 

但后来我得到这个错误:

Traceback (most recent call last): 
    File "manage.py", line 9, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 327, in execute 
    django.setup() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/__init__.py", line 18, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/Users/RyanWaite/Desktop/epsity/webapp/models.py", line 320, in <module> 
    class Posts(models.Model): 
    File "/Users/RyanWaite/Desktop/epsity/webapp/models.py", line 335, in Posts 
    owner = models.ForeignKey(OwnerType, default = 0, related_name = "post_owner") 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py", line 754, in __init__ 
    RECURSIVE_RELATIONSHIP_CONSTANT, 
AssertionError: ForeignKey(((<class 'webapp.models.Accounts'>, u'User'), (<class 'webapp.models.Groups'>, u'Group'))) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string u'self' 

是,即使可能吗?创建模型的新实例时,我可以为外键选择模型吗?我有两种可以发布帖子的模型:用户和组。用户可以发帖子或组可以发帖子。

回答

1

从文档doc

A normal ForeignKey can only “point to” one other model, which means that if the TaggedItem model used a ForeignKey it would have to choose one and only one model to store tags for

你可以使用GenericForeignKey允许的关系是与任何型号的

+0

谢谢!我实际上找到了解决这个问题的方法。我只是使用了一个类型和类型的id字段,然后创建了一个函数,该函数将返回基于给定参数的模型实例。谢谢! – ryanwaite28

0

所以这里是解决这个我自定义的方式:

我加了一个类型和TYPE_ID字段,其中type是模型类的字符串。 然后我创建了一个函数,它将返回基于给定参数的模型实例。为前。 :

def returnModelSerialized(type, id): 
    if id == None: 
     return 'error --- Missing id' 

    if type == '' or Type == None: 
     return 'error --- invalid type' 

    if type == 'Account': 
     obj = Accounts.objects.get(id = id) 
     return obj.serialize 

    if type == 'Group': 
     obj = Groups.objects.get(id = id) 
     return obj.serialize 

所以当我调用序列化属性的方法,它会是这样的:

class Likes(models.Model): 

OwnerType = (
    ('Account', 'Account'), 
    ('Group', 'Group'), 
) 

ContentType = (
    ('Post', 'Post'), 
    ('Comment', 'Comment'), 
    ('Reply', 'Reply'), 
    ('Group', 'Group'), 
    ('Event', 'Event'), 
) 

ownerid = models.IntegerField(blank = False, default = 0) 
owner_type = models.CharField(choices = OwnerType, blank = False, default = '', max_length = 50) 

item_type = models.CharField(choices = ContentType, blank = False, default = '', max_length = 50) 
item_id = models.IntegerField(blank = False, default = 0) 

date_created = models.DateField(auto_now_add=True) 
last_active = models.DateField(auto_now=True) 

@property 
def serialize(self): 
    return { 
     'like_id': self.id, 

     'ownerid': self.ownerid, 
     'owner': returnModelSerialized(self.owner_type , self.ownerid), 
     'owner_type': self.owner_type, 
     'item_type': self.item_type.serialize, 
     'item_id': self.item_id, 
     'date_created': self.date_created, 
     'last_active': self.last_active 
    } 

class Meta: 
    db_table = "likes"