2013-12-05 2 views
6

У меня есть модель, которая по существу представляет собой одну таблицу с четырьмя таблицами поиска. Одна из таблиц поиска - это указать тип. Исходя из типа (которого четыре), требования к полям изменяются. Например, если типом является «Опрос», требуется поле number_of_unique_contacts, но не для какого-либо другого типа.Как проверить модель в каркасе отдыха django?

Я рассмотрел использование нескольких таблиц и шаблона БД на основе моделирования наследования. Но это не имеет смысла, поскольку существует только четыре типа, и только 6 полей находятся в игре как «контекстуально требуемые», зависящие от типа. При этом я был бы открыт для нескольких моделей внутри Django, но я предпочитаю, чтобы REST-инфраструктура представляла только один URI (не один из TYPE).

Вопрос в том, что является наилучшим способом проверки модели на запросы POST/PUT? Мне лучше выбрать другую схему базы данных (как уже упоминалось, я думаю, что у меня есть то, что мне нравится)? Должна ли реструктурировать мою модель python (опять же один основной класс с четырьмя поисками)?

Я новичок в Django и python, поэтому, пожалуйста, будьте нежны (фон .NET/Java). И заблаговременно спасибо

Что я думаю о соответствующем коде (честно говоря, код, вероятно, не имеет значения, так как это скорее вопрос дизайна, но я всегда чувствую странную публикацию без кода - в аренду для контекста)

class MySerializer(serializers.ModelSerializer): 
    proposal_side = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_side') 
    my_proposal_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_type') 
    my_proposal_delivery_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='delivery_type') 
    my_survey_method = serializers.SlugRelatedField(many=False, read_only=False, slug_field='method') 
    class Meta: 
     model = diliModels.Proposal 
     fields = (
      'id' 
      ,'my_proposal_side' 
      ,'my_proposal_type' 
      ,'number_of_participants' 
      ,'cost_per_participants' 
      ,'minimum_dollar_commitment' 
      ,'commercial_terms' 
      ,'is_publicly_visible' 
      ,'is_anonymous' 
      ,'is_republish' 
      ,'name' 
      ,'my_delivery_type' 
      ,'my_survey_method' 
      ,'number_of_unique_contacts' 
      ,'availability_start' 
      ,'availability_end' 
      ,'location_country' 
      ,'location_city' 
      ,'location_state' 
      ,'description' 
      ,'desired_meetings' 
     ) 


class MyViewSet(viewsets.ModelViewSet): 
    paginate_by = 100 

    queryset = myModels\ 
     .MyProposal\ 
     .objects\ 
     .prefetch_related('blah') 
    print 'SQL::MyViewSet: ' + str(queryset.query) 
    serializer_class = serializers.MySerializer 

ответ

2

Добавьте метод Validate к классу сериализатора является одним из вариантов

class MySerializer(serializers.ModelSerializer): 
    proposal_side = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_side') 
    my_proposal_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_type') 
    my_proposal_delivery_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='delivery_type') 
    my_survey_method = serializers.SlugRelatedField(many=False, read_only=False, slug_field='method') 
    class Meta: 
     model = diliModels.Proposal 
     fields = (
      'id' 
      ,'my_proposal_side' 
      ,'my_proposal_type' 
      ,'number_of_participants' 
      ,'cost_per_participants' 
      ,'minimum_dollar_commitment' 
      ,'commercial_terms' 
      ,'is_publicly_visible' 
      ,'is_anonymous' 
      ,'is_republish' 
      ,'name' 
      ,'my_delivery_type' 
      ,'my_survey_method' 
      ,'number_of_unique_contacts' 
      ,'availability_start' 
      ,'availability_end' 
      ,'location_country' 
      ,'location_city' 
      ,'location_state' 
      ,'description' 
      ,'desired_meetings' 
     ) 

    def validate(self, attrs): 
     raise serializers.ValidationError("error") 
     return attrs 
Смежные вопросы