复制派生自抽象模型(Django)的类的所有字段

时间:2018-10-12 21:55:38

标签: python django django-models

我有两个结构AB,它们的结构是从相同的抽象模型得出的:

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    # ...  # more fields

    class Meta:
        abstract = True

class A(CommonInfo):
    pass

class B(CommonInfo):
    pass

现在有了一个类A的对象,我想创建一个具有相同字段值的类B的对象。

Django将一个对象的所有字段复制到另一个对象的正确方法是什么?

我知道的唯一方法是枚举一个对象的所有字段(顺便说一句,怎么做?)并将它们存储在另一个对象中。但是有没有更简单的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用Traceback (most recent call last): File "C:/Users/SawyerPC/PycharmProjects/DiscordSocialGraph/encode_and_train.py", line 129, in <module> enc, clf, split_data = encode_and_train(df) File "C:/Users/SawyerPC/PycharmProjects/DiscordSocialGraph/encode_and_train.py", line 57, in encode_and_train svc.fit(X_train, y_train) # TODO y_train needs to be flattened to (n_samples,) File "C:\Users\SawyerPC\Anaconda3\lib\site-packages\sklearn\svm\base.py", line 149, in fit X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr') File "C:\Users\SawyerPC\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 547, in check_X_y y = column_or_1d(y, warn=True) File "C:\Users\SawyerPC\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 583, in column_or_1d raise ValueError("bad input shape {0}".format(shape)) ValueError: bad input shape (5000, 10) 并在构造model_to_dict(..)对象时使用此字典,例如:

B

请注意,如果from django.forms.models import model_to_dict my_b = B(**model_to_dict( my_a, fields=[f.name for f in CommonInfo._meta.fields], )) # some processing my_b.save()包含对象的外键,则将复制这些引用,但不会构造新的引用对象。此外,这对许多字段都不起作用,因此您需要排除这些字段(并在以后添加相关对象)。