相关疑难解决方法(0)

Django模型:两个类之间的相互引用和在python中使用前向声明的不可能性

我定义了两个模型,每个模型引用另一个模型,如下所示:

class User(models.Model):
    # ...
    loves = models.ManyToManyField(Article, related_name='loved_by')

class Article(models.Model):
    # ...
    author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

你看,问题是两个类都互相引用.无论这两个类的实现顺序如何,python总是引发NameError异常,抱怨任何一个类都没有定义.

python django model foreign-keys forward-declaration

17
推荐指数
1
解决办法
4242
查看次数

声明的顺序在models.py(Django/Python)中是否重要?

我在models.py中有这样的东西

class ZipCode(models.Model):
    zip = models.CharField(max_length=20)
    cities = City.objects.filter(zip=self).distinct()

class City(models.Model):
    name = models.CharField(max_length=50)
    slug = models.CharField(max_length=50)
    state = models.ForeignKey(State)
    zip = models.ManyToManyField(ZipCode)
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到:

NameError: name 'City' is not defined
Run Code Online (Sandbox Code Playgroud)

这是因为申报的顺序很重要吗?如果是这样,我怎么能这样做,因为无论我采用哪种方式,看起来我都会得到一个NameError.

谢谢.

django django-models

5
推荐指数
3
解决办法
4098
查看次数

在声明之前引用python中的类

好的,因此使用Django REST框架教程中的直接示例,我有2个类:UserSerializer和SnippetSerializer。我希望能够在SnippetSerializer类声明中将“ UserSerializer”用作序列化程序,但是由于某些原因,需要首先声明SnippetSerializer。代码示例:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = UserSerializer()
    #unimportant stuff

class UserSerializer(serializers.HyperlinkedModelSerializer):
    #unimportant stuff - lets say we reference SnippetSerializer here
Run Code Online (Sandbox Code Playgroud)

我想到的明显答案是前向声明,但是从我的所有研究中,我无法在Python中找到它。

我认为可能可行的另一种解决方案,但没有(也许我做错了吗?),而是尝试在init方法中声明此关系。

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    def __init__(self, *args, **kwargs):
        self.owner = UserSerializer()
        super(SnippetSerializer, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但这似乎被框架完全忽略了。

我也尝试使用@addto,但似乎仅适用于函数,不适用于属性/属性

有办法解决这个问题吗?这个“先有鸡”类问题已经在Python中杀死了我一段时间,但是我终于遇到了一个实例,该实例实际上阻止了我完成工作。

python django forward-declaration

5
推荐指数
1
解决办法
1147
查看次数

如何在Python中转发声明/原型化函数?

如何在类似于C++的通用python程序中对方法进行原型设计?

//PROTOTYPE
do python protoyping

writeHello() //GIVES ERROR AS IT WAS NOT DEFINED YET

def writeHello():
    print "Hello"
Run Code Online (Sandbox Code Playgroud)

python function-prototypes

4
推荐指数
1
解决办法
2万
查看次数

Python内部函数的前向声明

我第一次看到了Python,我被困在这里:

class A:
    def __init__(self):
        a = foo("baa")

class B(A):
    b = foo("boo")

def foo(string):
    return string
Run Code Online (Sandbox Code Playgroud)

此时我加载上面的文件(命名classes),这发生了:

$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from classes import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "classes.py", line 5, in <module>
    class B(A):
  File "classes.py", line 6, in B
    b = foo("boo")
NameError: …
Run Code Online (Sandbox Code Playgroud)

python class-design forward-declaration

3
推荐指数
1
解决办法
2665
查看次数

Python是否支持类中的前向声明?

# animal.py
class Animal:
    def __init__(self):
        self.action = {'feed':feed_pet}

    def do_action(self, a):
        action[a]()

    def feed_pet(self):
        print('Gives some food')

# main.py
from animal import *
my_pet = Animal()
my_pet.do_action('feed')
Run Code Online (Sandbox Code Playgroud)

我正在制作游戏,但这段代码给了我以下错误:

Traceback (most recent call last):
  File "so.py", line 3, in <module>
    my_pet = Animal()
  File "/home/wdwickar/pyside/animal.py", line 4, in __init__
    self.action = {'feed':feed_pet}
NameError: name 'feed_pet' is not defined
Run Code Online (Sandbox Code Playgroud)

像C这样的Python中没有前向声明吗?

python python-3.x

0
推荐指数
1
解决办法
815
查看次数