Django: Ограничение NOT NULL

Я новичок в django и получаю ошибку, когда хочу сохранить список объектов. Есть два объекта Hopper (один) и Trade (много). Я не уверен, как сохранить их правильным образом. Объект Hopper уже есть в базе данных. Поэтому я попытался установить id бункера как внешний ключ в объект торговли.

Это ошибка при сохранении tadeArray:

django.db.utils.IntegrityError: NOT NULL constraint failed: trade.hopper_id

.

Значит, при попытке сохранить сделки поле будет равно нулю, верно?

Модели (сокращенно):

class Trade(models.Model):
    # Relationships
    hopper = models.ForeignKey(Hopper, related_name='trades', on_delete=models.CASCADE)  # this should call the error :: django.db.utils.IntegrityError: NOT NULL constraint failed: trade.hopper_id

    # Fields
    id_db = models.IntegerField(primary_key=True, default=-1)
    # ... many attributes
    trigger_strategy = models.TextField(default=None)
    type = models.TextField(default=None)

    class Meta:
        # Set the table name.
        db_table = 'trade'

        # Set default ordering
        ordering = ['id']

        
class Hopper(models.Model):
    # Relationships
    id_db = models.IntegerField(primary_key=True, default=None)
    id = models.IntegerField(default=None)
    open_positions_count = models.TextField(default=None)
    name = models.TextField(default=None)
    exchange = models.TextField(default=None)
    hopper_id = models.TextField(default=None)
    # ... many attributes
    paper_trading = models.IntegerField(default=-1)
    start_balance = models.TextField(default=None)

Сериализаторы:

class HopperSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hopper

        fields = ['id',
                  'open_positions_count',
                  'name',
                  'exchange',
                  'hopper_id',
                  'subscription_id',
                  # ... many attributes
                  'paper_trading',
                  'start_balance',
                  ]

    def create(self, validated_data):
        return Hopper.objects.create(**validated_data)

class TradeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Trade

        fields = [
            'id',
            'exchange',
            'currency',
            'pair',
            # ... many attributes
            'buy_id',
            'is_short',
            'result_short']
        extra_kwargs = {
            'hopper': {'allow_null': True, 'required': False}
        }

    def create(self, validated_data):
        return Trade.objects.create(**validated_data)

views.py (этот def вызывается и бросает исключение)

@api_view(('POST', 'GET'))
@csrf_exempt
def trades(request, hopper_id):
    if request.method == 'POST':
        data = request.data
        serializer = TradeSerializer(data=data, many=True)
        if serializer.is_valid():
            hopper = Hopper.objects.get(id=hopper_id)
            print(hopper)
            serializer.save() # at this point i stuck too. the id of the hopper must be saved with the trades
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

наилучшие пожелания

class Trade(models.Model):
    
    hopper = models.ForeignKey(Hopper, related_name='trades', on_delete=models.CASCADE, null=True, blank=True)
 # ... your other fields

Я много раз сталкивался с ошибкой NOT NULL constraint failed, я решил эту проблему, установив поле вышеуказанным способом. Устанавливая поле hopper null=True, вы сообщаете своей базе данных, что это поле может не иметь никакого значения. Таким образом, ошибка будет устранена.

Вернуться на верх