【问题标题】:Saving(create,update) along with foreignkey value from another model which is related user model保存(创建,更新)以及来自与用户模型相关的另一个模型的外键值
【发布时间】:2020-03-19 12:23:25
【问题描述】:

如果您没有正确回答,这可能是一个具有挑战性的问题。这里我有三个模型,其中部门模型应该通过从与人员模型相关的 Place 模型中获取其地名来创建。 Staff 模型与 User 存在 OneToOneField 关系,因此当用户创建部门时,应像 HTML 中的 HiddenField 一样传递地名。此地名与具有 GenericForeignKey 的用户的地点模型相关。我创建了一个没有按预期工作的序列化程序,它正在返回地名, .

很快我想创建一个部门,而地点应该从当前用户ID

中选择
  class Staff(BaseModel):
        ROLES = [
            ('ADMIN', 'Admin'),
            ('TEACHER', 'Teacher')
        ]
        auth_user = models.OneToOneField(User, on_delete=models.CASCADE)
        name = models.CharField(max_length=50)
        school_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
        school_id = models.PositiveIntegerField()
        school = GenericForeignKey('school_content_type', 'school_id')
        role = models.CharField(null=True, blank=True, choices=ROLES, max_length=20)

class Places(BaseModel):
    name = models.CharField(max_length=50)
    code = models.CharField(max_length=12, unique=True)



class Department(BaseModel):
    TYPES = [
        ('ONLINE', 'Online'),
        ('OFFLINE', 'OfFline')
    ]
    department_type = models.CharField(max_length=15, choices=TYPES)
    service_no = models.CharField(max_length=50)
    instructions = models.TextField(null=True, blank=True)
    place = models.ForeignKey(Places, to_field='code', db_column='place_code', on_delete=models.PROTECT)

序列化器

class DepartmentCreateSerializer(serializers.ModelSerializer):
    place_code=serializers.CharField(read_only=True)
    class Meta:
        model=Department
        fields = ('department_type','service_no','instructions')
    def get_place(self, request):
            user_id=self.context['request'].user.id
            school_id=Staff.objects.get(auth_user_id= user_id).school_id
            places_code_name=Places.objects.get(id= school_id).name 

【问题讨论】:

    标签: django-rest-framework foreign-keys django-serializer generic-foreign-key


    【解决方案1】:
    class PlacesSerializer(serializers.ModelSerializer):
        class Meta:
            model = Places
            fields = ('id', 'code', 'name')
    
    
    from places.serializers import PlacesSerializer
    class DepartmentCreateSerializer(serializers.ModelSerializer):
            place= PlacesSerializer(read_only=True)
            class Meta:
                model=Department
                fields = ('place','service_no','instructions')
            def validate(self, attrs):
                palce_obj = self.context['request'].user.staff.place()
                attrs.update({'place': place_obj})
                attrs = super().validate(attrs)
                if not attrs.get('place', None):
                    raise serializers.ValidationError({'place': ["Place required"]})
                return attrs
    

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 2012-05-02
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多