68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
from django.contrib.auth.models import User
|
|
from rest_framework import serializers
|
|
|
|
from .models import Item, ItemUsage, Category
|
|
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'username', 'first_name', 'last_name', 'email']
|
|
|
|
|
|
class CategorySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Category
|
|
fields = ['id', 'name', 'description', 'created_at']
|
|
|
|
|
|
class ItemSerializer(serializers.ModelSerializer):
|
|
current_user = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Item
|
|
fields = [
|
|
'id', 'name', 'description', 'serial_number', 'category', 'status',
|
|
'location', 'owner', 'purchase_date', 'value', 'created_at', 'updated_at',
|
|
'current_user'
|
|
]
|
|
|
|
def get_current_user(self, obj):
|
|
"""获取当前正在使用该物品的用户"""
|
|
current_usage = ItemUsage.objects.filter(
|
|
item=obj, is_returned=False
|
|
).first()
|
|
if current_usage:
|
|
return {
|
|
'username': current_usage.user,
|
|
'contact': current_usage.borrower_contact
|
|
}
|
|
return None
|
|
|
|
|
|
class ItemUsageSerializer(serializers.ModelSerializer):
|
|
item_name = serializers.CharField(source='item.name', read_only=True)
|
|
item_serial = serializers.CharField(source='item.serial_number', read_only=True)
|
|
|
|
class Meta:
|
|
model = ItemUsage
|
|
fields = [
|
|
'id', 'item', 'item_name', 'item_serial', 'user', 'borrower_contact',
|
|
'start_time', 'end_time', 'purpose', 'notes', 'is_returned',
|
|
'condition_before', 'condition_after', 'expected_return_time', 'created_at'
|
|
]
|
|
read_only_fields = ['created_at']
|
|
|
|
|
|
class ItemDetailSerializer(ItemSerializer):
|
|
"""物品详情序列化器,包含使用历史"""
|
|
usage_history = serializers.SerializerMethodField()
|
|
|
|
class Meta(ItemSerializer.Meta):
|
|
fields = ItemSerializer.Meta.fields + ['usage_history']
|
|
|
|
def get_usage_history(self, obj):
|
|
"""获取物品的使用历史"""
|
|
usages = ItemUsage.objects.filter(item=obj).order_by('-start_time')[:10]
|
|
return ItemUsageSerializer(usages, many=True).data
|