django模型设计:“;ptr字段是必填的";

django模型设计:“;ptr字段是必填的";,django,django-models,orm,django-rest-framework,foreign-keys,Django,Django Models,Orm,Django Rest Framework,Foreign Keys,我正在使用Python 3.6+PostgreSQL 10+最新的Django和Djangorest框架。我有以下模型,其中几个模型继承自一个类,该类是另一个类的外键(一对多) class Voteable(models.Model): Voteable_id = models.BigAutoField(primary_key=True); class base(Voteable): class Meta: abstract = False class t

我正在使用Python 3.6+PostgreSQL 10+最新的Django和Djangorest框架。我有以下模型,其中几个模型继承自一个类,该类是另一个类的外键(一对多)

class Voteable(models.Model):
      Voteable_id = models.BigAutoField(primary_key=True);

class base(Voteable):
    class Meta:
        abstract = False

class traslated_info(models.Model):
    info_about=models.ForeignKey(base)
    info_body=models.TextField()
    info_language=models.CharField(max_length=2)

class A(base):
    A_id=models.BigAutoField(primary_key=True)
    A_field=models.TextField()

class B(base):
    B_id=models.BigAutoField(primary_key=True)
    B_field=models.TextField()
    B_belongs_to=models.ForeignKey(A)

class C(base):
    C_id=models.BigAutoField(primary_key=True)
    C_field=models.TextField()
    C_belongs_to=models.ForeignKey(A)
    C_belongs_to=models.ForeignKey(B)
每当我尝试保存对象A(通过curl)时,django说需要base_ptr。我不知道如何模拟这种情况。最终用户不希望创建项目库,然后创建项目A、B或C。我尝试将类库作为抽象类,但抽象类不能是ForeignKey。我想在创建类a时自动创建基类

我想我有两个选择:A)删除ForeignKey并将特定语言的信息字段存储为HStoreField。这使得代码在某种程度上依赖于Postgree。B) 创建某种例程,每当创建子项时自动创建父项基本项(保留一对一关系)


你推荐什么?是否有一些django easy选项是我在做选项B时遗漏的?我没有找到这个。谢谢。

在模型A、B或C中使用autofield作为主键会导致此错误,因为创建子模型不会级联创建父模型。 我找到了两个解决办法:

  • 将自动字段选项主键更改为false并添加 静音系统检查=['fields.E100']
  • 覆盖Viewset创建方法:
@原子事务

def create(self,request,*args,**kwargs):
    request.data['base_ptr'] = base.objects.create(user=request.user,created_date=datetime.utcnow()).pk
    return super(viewsets.ModelViewSet,self).create(request,*args,**kwargs)

我将坚持第二种方法,我确信会出现更多的问题。

如下所示创建序列化程序,您不需要显式创建基类,它将自动创建

class ASerializer(serializers.ModelSerializer):
    class Meta:
        model = A
        read_only_fields = ('base_ptr',)
        fields = '__all__'

模型并不是真正的OOP类。模型是数据库关系。继承(除非您使用的是AbstractModel)很少是正确的做法