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
, вы сообщаете своей базе данных, что это поле может не иметь никакого значения. Таким образом, ошибка будет устранена.