簡體   English   中英

保存(創建,更新)以及來自與用戶模型相關的另一個模型的外鍵值

[英]Saving(create,update) along with foreignkey value from another model which is related user model

如果你沒有做對,這可能是一個具有挑戰性的問題。 這里我有三個模型,其中部門模型應該通過從與員工模型相關的 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 
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM